1

任何已知情况TypedActor.getContext().sender()不符合预期?

我知道在即发即弃模式下,它默认为deadLetters,但是我遇到了一些不同的事情:

// inside MainActor

IPrintingActor printingActor = create(IPrintingActor.class, PrintingActor.class);
printingActor.blockingPrintln("foo");

create以上只是通常调用的包装typedActorOf

// inside PrintingActor
@Override
public boolean blockingPrintln(String string)
{
   System.out.println(TypedActor.context().sender() + " says " + string);
   return true;
}

输出是

演员[akka://MySystem/user/$b] 说 foo

然而,这个actor实际上和TypedActor.context().self()是一样的。

sender() 调用将返回与 self() 相同的任何原因?在主角打印中打印语句

演员[akka://MySystem/user/$a]

对于 MainActor 和

演员[akka://MySystem/user/$b]

为印刷演员。然而,在 PrintingActor 中,它们都被打印为

演员[akka://MySystem/user/$b]

非常感谢帮助!

4

1 回答 1

1

表示方法调用的消息的发送者将始终是由“询问”模式生成的临时参与者,例如.../temp/$a。原因是接收回复的不是演员,而是某个内部实体,然后将回复值作为方法调用返回值返回。因此,无论它是如何实现的,您永远不会看到包含方法调用站点的参与者的引用作为发送者。

附带说明:我无法重现您的发现(即发件人是.../user/$a或类似的),但您也没有指定您使用的 Akka 版本。

于 2013-03-16T20:41:49.637 回答