我正在使用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的地址。这可能吗?或许更重要的是这个明智的,或好的演员设计?
由于
答案 0 :(得分:9)
请参阅actor上的tell
方法。当CommandActor转发其消息时,请调用:
childActor.tell(msg, sender)
并且childActor将其发件人作为原始发件人。
答案 1 :(得分:4)
如果我理解你的正确理解,你应该使用前锋。来自文档:
您可以将消息从一个actor转发到另一个actor。这意味着即使消息通过“调解器”,也会保留原始发件人地址/引用。在编写充当路由器,负载平衡器,复制器等的actor时,这非常有用。
myActor.forward(消息)