在Akka,我可以欺骗来自不同演员的消息吗?

时间:2012-11-05 21:41:37

标签: scala akka

我正在使用Akka来控制对正在运行的系统进程的访问。

我有一个CommandActor来处理来自系统中任何actor的传入命令请求(让我们称之为RequestActor),并且对于每个新请求,CommandActor会生成一个单独的CmdChildWorker actor来处理该特定请求。 CommandActor还限制了CmdChildWorkers的数量,并为每个请求分配一个唯一的id,因此它比简单的路由器更复杂。

当命令完成时,并在执行系统进程期间定期执行,CmdChildWorker actor会定期将更新发送回原始RequestActor(例如,到目前为止的进程输出)。

但是,为了保持干净的设计,我希望能够保持CmdChildWorker完全隐藏在原始的RequestActor之外,其唯一的接口是单个CommandActor。

显然,我可以通过CommandActor从CmdChildWorker发回任何回复消息,但我想知道是否可以直接从CmdChildWorker回复RequestActor,而不必通过CommandActor路由消息,但仍然假装消息已从CommandActor发回。

即。我想将CmdChildWorker actor发件人地址欺骗为其父actor的地址。这可能吗?或许更重要的是这个明智的,或好的演员设计?

由于

2 个答案:

答案 0 :(得分:9)

请参阅actor上的tell方法。当CommandActor转发其消息时,请调用:

childActor.tell(msg, sender)

并且childActor将其发件人作为原始发件人。

答案 1 :(得分:4)

如果我理解你的正确理解,你应该使用前锋。来自文档:

您可以将消息从一个actor转发到另一个actor。这意味着即使消息通过“调解器”,也会保留原始发件人地址/引用。在编写充当路由器,负载平衡器,复制器等的actor时,这非常有用。

  

myActor.forward(消息)