2017-08-11 58 views
0

我們在Java中使用Akka時,如果在ask回調中使用轉發,我們不會得到任何迴應,但是使用tell時,它可以正常工作。那麼區別是什麼呢?java - 轉發內部Akka演員請求回調

final Message message = Message.builder().build(); 
final ActorRef sender = getSender(); 
final ActorContext context = getContext(); 

PatternsCS.ask(actor, Command.builder().build(), 
     Timeout.durationToTimeout(Duration.create(5, TimeUnit.SECONDS))).thenAccept(result -> { 

    // do something with result 
    ... 

    // 1: Does not work 
    actor.forward(message, context); 
    // 2: Does work 
    actor.tell(message, sender); 

}); 

在調用在第一種情況下getender()當接收演員計算結果爲DeadLetterActorRef在它的計算結果爲在ActorRef傳遞的第二殼體。

那麼爲什麼forward不能在這裏工作?與tell(message, sender)有什麼不同?

回答

0

您只能在執行「參與者內部」時使用context,即僅在處理receive或其中一個生命週期回調期間的消息期間。

當您在thenAccept中使用它時,即使代碼在actor類中被語法定義,它也會在另一個線程中從actor中分離出來。在另一個線程中,context將無效。

與原始發件人一起使用tell的替代方法是正確的方法。