2017-08-11 9 views
0

私たちはAkkaをJavaで使用していますが、askコールバック内でコールを使用しても応答はありませんが、代わりにtellを使用すると問題ありません。違いは何ですか?受信アクターにjava - forwardコールバックで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()を呼び出すときにActorRef渡されたと評価され第二の場合にDeadLetterActorRefと評価。

なぜforwardはここでは機能しませんか? tell(message, sender)との違いは何ですか?

答えて

0

contextは、「アクターの内部」を実行中、つまりreceiveまたはライフサイクルコールバックのいずれかでメッセージを処理するときにのみ使用できます。

thenAcceptの内部で使用すると、コードがアクタークラス内で構文的に定義されていても、別のスレッドのアクターからデタッチされます。この他のスレッドでは、contextは有効ではありません。

tellを元の送信者に使用する代わりに、適切な方法があります。

関連する問題