2016-09-16 8 views
2

Ich fange an, Cyclops-Reagieren mit Async-Retry zu verwenden. Ich bin immer noch ein bisschen verloren damit.Cyclops-Reagieren und Async-Retry: Wie bei Timeout erneut versuchen?

Ich verwende SimpleReact und ein Timeout von dem Server simuliert, aber ich habe nie ein Timeout mit so etwas wie diese erhalten:

private List<Object> executeParallel() { 
    List<Object> result = new SimpleReact(mainThreadPool) 
      .of(getSupplier()) 
      .withRetrier(new AsyncRetryExecutor(retryThreadPool) 
        .abortIf((t) -> !TimeoutException.class.isAssignableFrom(t.getClass())) 
      ) 
      .retry(retrySupplier()) 
      .block() 
      .collect(Collectors.toList()); 
    return result; 
} 

private Supplier getSupplier() { 
    return() -> someOperationThatTimesOut(); 
} 

private Function<Supplier, Object> retrySupplier() { 
    return supplier -> supplier.get(); 
} 

Was dort fehlt?

+0

Hey Jorge, ich werde eine detaillierte Antwort hinzufügen, aber die Funktion, die Timeout sollte der Wiederholungsoperator geliefert werden. –

Antwort

1

Diese Version

AtomicInteger count = new AtomicInteger(0); 

@Test 
public void executeParallel() { 
    List<Object> result = new SimpleReact(Executors.newFixedThreadPool(1)) 
      .of(getSupplier()) 
      .withRetrier(new AsyncRetryExecutor(Executors.newScheduledThreadPool(1)) 
      .retry(Supplier::get) 
      .block() 
      .collect(Collectors.toList()); 
    System.out.println(result); 
} 

private Supplier<String> getSupplier() { 
    return() -> { 
     System.out.println("Attempt " + count.incrementAndGet()); 
     if(count.get()<4) 
      throw ExceptionSoftener.throwSoftenedException(new TimeoutException()); 
     return "success"; 
    }; 
} 

arbeitet, wird es ausdrucken

Attempt 1 
Attempt 2 
Attempt 3 
Attempt 4 
[success] 

Ich vermute, dass Sie nicht über die abortif müssen auf der Asynchron-retrier, und ich bin mir nicht sicher, was im Inneren geht someOperationThatTimesOut() - das könnte hier der Schlüssel sein.

+0

Danke für die Antwort @ john-mcClean. Grundsätzlich ja. Alles war korrekt, aber die Operation, die Timeout sein sollte, war kein Timeout wegen einer Fehlkonfiguration – Jorge

+0

Cool - wenn Sie weitere Fragen haben, bitte feuern Sie weg! Vielen Dank! –

Verwandte Themen