akka(java)sender()方法的行为异常
是否存在akka(java)sender()方法的行为异常,java,akka,actor,sender,Java,Akka,Actor,Sender,是否存在TypedActor.getContext().sender()行为不符合预期的已知情况 我知道在fire and forget模式下,它默认为死信,但我遇到了一些不同的情况: // inside MainActor IPrintingActor printingActor = create(IPrintingActor.class, PrintingActor.class); printingActor.blockingPrintln("foo"); 其中,上面的create只是普
TypedActor.getContext().sender()
行为不符合预期的已知情况
我知道在fire and forget模式下,它默认为死信,但我遇到了一些不同的情况:
// 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说
但是,此参与者实际上与TypedActor.context().self()相同
sender()调用返回与self()相同的结果的原因是什么?在主参与者打印中打印语句
演员[akka://MySystem/user/$a]
主要演员和
演员[akka://MySystem/user/$b]
对于PrintingActor。但是,在PrintingActor中,它们都作为
演员[akka://MySystem/user/$b]
非常感谢您的帮助 表示方法调用的消息的发送者将始终是由“ask”模式生成的临时参与者,例如
../temp/$a
。原因是接收应答的不是参与者,而是某个内部实体,该实体随后将应答值作为方法调用返回值返回。因此,无论它是如何实现的,您永远不会看到作为发送方包含方法调用站点的actor的ref
另一方面:我无法复制您的发现(即发送者是
../user/$a
或类似者),但您也没有指定您正在使用的Akka版本。表示方法调用的消息发送者将始终是“ask”模式生成的临时参与者,例如,../temp/$a
。原因是接收应答的不是参与者,而是某个内部实体,该实体随后将应答值作为方法调用返回值返回。因此,无论它是如何实现的,您永远不会看到作为发送方包含方法调用站点的actor的ref
附带说明:我无法复制您的发现(即发件人是
../user/$a
或类似的),但是您也没有指定您正在使用的Akka版本。我不是Akka方面的专家,因为我的背景来自erlang方面,但如果我没有弄错的话,您直接调用了类的方法,但实际上没有向参与者发送消息。我认为您应该使用bang(!)操作符向ActorTanks发送消息,以便查看这一点,但是我使用的是类型化的actors。因此,我所做的实际上是阻止消息发送,我不是Akka方面的专家,因为我的背景来自erlang方面,但如果我没有弄错的话,您是直接调用类的方法,而不是实际向参与者发送消息。我认为您应该使用bang(!)操作符向ActorTanks发送消息,以便查看这一点,但是我使用的是类型化的actors。因此,我所做的实际上是阻止消息发送给你是正确的,我最近意识到其中一个实际上是作为演员打印的[akka://MySystem/temp/$b]和另一个演员[akka://MySystem/user/$b](临时vs用户)。不过你的回复速度更快。谢谢你是对的,我最近意识到其中一个实际上是作为演员印刷的[akka://MySystem/temp/$b]和另一个演员[akka://MySystem/user/$b](临时vs用户)。不过你的回复速度更快。谢谢