2017-08-11 49 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的替代方法是正确的方法。