akka(java)sender()方法行为奇怪

时间:2013-03-16 00:20:36

标签: java akka actor sender

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()相同的原因吗?打印主要参与者的声明

  

演员[阿卡:// MySystem /用户/ $ A]

用于MainActor和

  

演员[阿卡:// MySystem /用户/ $ B]

用于PrintingActor。但是,在PrintingActor中,它们都打印为

  

演员[阿卡:// MySystem /用户/ $ B]

非常感谢!

1 个答案:

答案 0 :(得分:1)

表示方法调用的消息的发送者将始终是由“ask”模式生成的临时actor,例如, .../temp/$a。原因是它不是接收回复的actor,而是一些内部实体,然后将回复值作为方法调用返回值返回。因此无论如何实现,您都不会看到将方法的调用站点作为发送者封装的actor的引用。

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