java - 在Akka演员里面转发请求回调

时间:2017-08-11 07:06:48

标签: java akka

我们正在使用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)有什么区别?

1 个答案:

答案 0 :(得分:1)

您只能在执行“演员内部”时使用context,即仅在处理receive或其中一个生命周期回调中的消息时。

当你在thenAccept中使用它时,它将在另一个线程中与actor分离运行,即使代码是在actor类中语法定义的。在另一个帖子中,context无效。

您与原始发件人一起使用tell的替代方法是正确的方法。