2015-02-21 11 views
6

Eşzamansız bir sonucu olan bir istisnayı ele almanın bariz bir yolunu göremiyorum. Örneğin, bir eşzamansız işlemi yeniden denemek istiyorsam. Bunun gibi bir şey beklerdim, ancak handleAsync, düşündüğün şeyi yapmaz - başka bir iş parçacığında geri aramaları eşzamansız olarak çalıştırır. Burada bir TamamlamaStage'i döndürmek doğru değil. Günün tehlike sorusu: o zaman ne zaman o kadar istisnadır. askPong bir aktör sorarJava8 CompletableFuture recoverBu eşdeğer mi? örn., istisnai bir şekilde ancak dönüşü CompletableFuture <U>

CompletionStage<String> cf = askPong("cause error").handleAsync((x, t) -> { 
     if (t != null) { 
      return askPong("Ping"); 
     } else { 
      return x; 
     } 
    }); 

:

public CompletionStage<String> askPong(String message){ 
    Future sFuture = ask(actorRef, message, 1000); 
    final CompletionStage<String> cs = toJava(sFuture); 
    return cs; 
} 
+0

"Doğru değil" ne anlama geliyor? Hangi davranışları arıyorsun? –

+0

Bu, derlenmeyecek. tutamacında bir CompletableFuture döndüremiyorAsync - U dönüşünde, istisna durumunda yerine bir CompletableFuture döndürmek istiyorum. Ben scala eşdeğer veya playwith kurtarma ile eşdeğer arıyorum (ki bu istisnai olarak ama Fonksiyonda asenkron bir sonuç ile). – JasonG

+0

Sorunun kendisinde biraz açıklığa kavuşturmaya çalıştım. Belki de handleAsync'i doğru kullanmıyorum ancak "bir zaman uyumsuz sonucunu döndürmek" anlamına gelmez. – JasonG

cevap

10

bu aradığınız şey mi? zaman uyumsuz yürütülecek verilen fonksiyonun vücut için düşünmüyorsanız Ayrıca

askPong("cause error") 
     .handle((pong, ex) -> ex == null 
       ? CompletableFuture.completedFuture(pong) 
       : askPong("Ping") 
     ).thenCompose(x -> x); 

, ...Async yöntemleri kullanmayın. Eğer

.handleAsync((x, t) -> { 
    if (t != null) { 
     return askPong("Ping"); 
    } else { 
     return x; 
    }) 

böyle bir şey yapmak Yani sen if-then-else için soruyorsunuz ayrı bir konu çalıştırılmak üzere. askPong, CompletableFuture döndürdüğünden, muhtemelen eşzamansız olarak çalıştırmak için bir neden yoktur.

+3

Bu çok korkunç. ama işe yarıyor. Çözüm için teşekkürler! Bunu düşünmemiştim. Yine de bir saldırıdır - API'da istisnai bir yöntem olmalıdır. – JasonG

+0

Orada sinir bozucu bir şey yok! Ben daha iyi bir gelecek arayüzü olan https://github.com/javaslang/javaslang kullanarak sona erebilir – Setheron

1

Scala'nın Java 8'deki iyileşmesini yapmanın doğru yolunu bulmaya çalışırken bir çok hayal kırıklığından sonra, sadece kendi yazımı yazdım. Bu iyi yaklaşım olup olmadığını hala bilmiyorum, ama ben böyle bir şey yarattı: recoverWith için sürekli çağrı ile

public RecoveryChainAsync<T> recoverWith(Function<Throwable, 
             CompletableFuture<T>> fn); 

, ben kurtarma zinciri içinde işlevlerini sıraya ve kurtarma kendimi akış uygulamak "idare ". RecoveryChainAsync.getCompletableFuture() daha sonra tüm zincir için bir temsilci CompletableFuture döndürür. Bu yardımcı olur umarım.

+1

Java8 lib bir sürü şey eksik. Daha iyi java-monadlar adlı bir kütüphanede çalışıyorum - eğer bir PR yaparsanız, çözümünüzü gözden geçirebilirim. İyi bir ek olabilir. Futures için de bir travers ekledim. https://github.com/jasongoodwin/better-java-monads – JasonG

İlgili konular