6

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

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

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

然而,为了保持简洁的设计,我希望能够将 CmdChildWorker 完全隐藏在原始 RequestActor 之外,它的唯一接口是单个 CommandActor。

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

即,我想将 CmdChildWorker 演员的发件人地址伪装成其父演员的地址。这可能吗?也许更重要的是,这是明智的,还是好的演员设计?

谢谢

4

2 回答 2

10

参见tellactor上的方法。当 CommandActor 转发它的消息时,调用:

childActor.tell(msg, sender)

并且 childActor 将其发送者作为原始发送者。

于 2012-11-05T22:04:58.277 回答
4

如果我正确理解您的要求,您应该使用 forward。从文档:

您可以将消息从一个参与者转发给另一个参与者。这意味着即使消息正在通过“中介”,原始发件人地址/参考也会被保留。这在编写充当路由器、负载平衡器、复制器等的actor时很有用。

myActor.forward(消息)

于 2012-11-06T15:19:23.780 回答