我们正在使用Akka和Java,当在ask
回调中使用转发时,我们没有得到任何响应,但是当使用tell
时,它可以正常工作。那有什么区别?
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()
时接收actor在第二种情况下评估为DeadLetterActorRef
,它评估为传入ActorRef
。
那么为什么forward
在这里不起作用?与tell(message, sender)
有什么区别?
答案 0 :(得分:1)
您只能在执行“演员内部”时使用context
,即仅在处理receive
或其中一个生命周期回调中的消息时。
当你在thenAccept
中使用它时,它将在另一个线程中与actor分离运行,即使代码是在actor类中语法定义的。在另一个帖子中,context
无效。
您与原始发件人一起使用tell
的替代方法是正确的方法。