저는 함수형 프로그래밍 (및 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{}
}
귀하의 코드는 이미 BiConsumer (기능 인터페이스), 람다 식을 사용하고 있으므로 무엇을하고 싶습니까? 일부 비동기식 솔루션을 찾고 있다면 CompletableFuture –
예,하지만 문제는 "재시도"매개 변수가 true 또는 false로 설정된 추한 재귀 호출입니다. BiConsumer를 확장하여 어쩌면 첫 번째 소비자를 자동으로 호출 할 필드로 추가 할 수있는 방법을 찾고 있습니다. – Igal