2016-09-16 47 views
2

我開始使用cyclops-async-retry進行反應。我仍然有點失落。cyclops-react和async-retry:如何在超時時重試?

我使用SimpleReact並從服務器模擬超時,但我從來沒有收到這樣的超時:

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(); 
} 

缺少什麼呢?

+0

嘿Jorge,我會添加一個詳細的答案,但可以超時的函數應提供給重試運算符。 –

回答

1

這個版本的作品

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"; 
    }; 
} 

它會打印出

Attempt 1 
Attempt 2 
Attempt 3 
Attempt 4 
[success] 

我懷疑你不需要在異步retrier的abortIf,我不知道是怎麼回事內someOperationThatTimesOut() - 這可能是關鍵。

+0

感謝您的回覆@ john-mcClean。基本上是的。一切都是正確的,但應該超時的操作不會由於配置錯誤而超時 – Jorge

+0

很酷 - 如果您還有其他問題,請立即開火!謝謝! –