0

저는 함수형 프로그래밍 (및 Java)을 처음 사용하고 있으며,이를 사용하여 멋진 것을 만들고 싶지만 어떻게 계산할 수는 없습니다.함수 인터페이스를 사용하여 한 번 재 시도하십시오.

저는 서버 호출에 BiConsumer (java.util.function.BiConsumer)를 사용하고 있습니다.

기존 데이터 (public createSomeTask() 호출)에 대한 일부 요청을 보내는 코드를 작성하려고하는데, 실패 할 경우에만 커넥터가 한 번만 재 시도를 수행합니다.

코드는 비동기이며, private createSomeTask()도 updateTaskStage()를 호출합니다.

문제는 내가 많은 구현을 가진 커넥터 (많은 createSomeTask())를 가지고 있다는 것입니다. 코드가 잘 보이지 않아 기능적 인터페이스를 사용하거나 확장하는 것이 더 낫습니다. BiConsumer 또는 Java 8 lile, reflection, method invoke 등의 다른 좋은 방법

아래 코드를 참조하십시오. 누군가가 저를 도울 수 있기를 바랍니다.

private void createSomeTask(
    String taskName, boolean retry, BiConsumer<ServerResponse, ServerError> consumer) { 

    BiConsumer<String, ServerError> direct 
     = (s, e) -> consumer.accept(e==null? new ServerResponse(): null, e); 

    BiConsumer<String, ServerError> actual = retry? 
     (string, error) -> { 
      if(error!=null) updateTaskStage(direct); else direct.accept(string, null); 
     }: 
     direct; 

    updateTaskStage(actual); 
} 

첫째, 함수가 생성됩니다 통과를 :

//Main 
public class Main { 
    public static void main(String[] args) throws InterruptedException { 
     Connector connector = new Connector(); 
     connector.createSomeTask("started",(response, error)->{ 
     }); 
    } 
} 

//Connector Class 
import java.util.function.BiConsumer; 

public class Connector { 
    static String taskStage = null; 

    public void createSomeTask(final String taskName, 
           final BiConsumer<ServerResponse, ServerError> consumer) { 
     createSomeTask(taskName, true, consumer); 
    } 

    private void createSomeTask(final String taskName, 
           boolean retry, 
           final BiConsumer<ServerResponse, ServerError> consumer) { 
     updateTaskStage((newStage, error)->{ 
      if(error!=null) { 
       if (retry) { 
        createSomeTask(taskName, false, consumer); //The 'recursive' retry call 
        return; 
       } else { 
        consumer.accept(null, error);//only after second failure 
        return; 
       } 
      } 
      consumer.accept(new ServerResponse(),null); 
     }); 

    } 

    //re-uses existing task or starting a new one when the current is null/failed 
    private void updateTaskStage(final BiConsumer<String, ServerError> consumer) { 
     if(taskStage ==null || taskStage != "failed") 
      consumer.accept(taskStage,null); 
     else 
     { 
      taskStage = "started"; 
      consumer.accept(taskStage,null); 
     } 
    } 

    class ServerResponse{} 
    class ServerError{} 
} 
+0

귀하의 코드는 이미 BiConsumer (기능 인터페이스), 람다 식을 사용하고 있으므로 무엇을하고 싶습니까? 일부 비동기식 솔루션을 찾고 있다면 CompletableFuture –

+0

예,하지만 문제는 "재시도"매개 변수가 true 또는 false로 설정된 추한 재귀 호출입니다. BiConsumer를 확장하여 어쩌면 첫 번째 소비자를 자동으로 호출 할 필드로 추가 할 수있는 방법을 찾고 있습니다. – Igal

답변

0

updateTaskStage에 전달하기 전에 옳은 일을하는 함수를 작성할 수, 소비자의 retry 플래그를 확인 할 이유가 없다 제공된 소비자에 대한 백엔드 응답에 대한 번역

retrytrue 인 경우에만 함수가 오류 케이스에서 두 번째 시도를 수행하는 다른 함수로 구성됩니다. 두 번째 시도에서는 직접 함수를 updateTaskStage으로 전달하여 재귀가 필요하지 않습니다. 항상 하나의 재 시도를 수행 할 때 그것은 retry 매개 변수 옵션,하지만 문제를 해결하여 시도의 일부가 안 된 것 같다으로

, 당신은 지금 그것을 제거 할 수 있습니다 것입니다 :

public void createSomeTask(
    String taskName, BiConsumer<ServerResponse, ServerError> consumer) { 

    BiConsumer<String, ServerError> direct 
     = (s, e) -> consumer.accept(e==null? new ServerResponse(): null, e); 

    BiConsumer<String, ServerError> actual= 
     (string, error) -> { 
      if(error!=null) updateTaskStage(direct); else direct.accept(string, null); 
     }; 

    updateTaskStage(actual); 
}