将消息传递给间接相关的参与者

时间:2015-09-07 11:47:46

标签: java scala concurrency akka message-passing

将消息传递给间接相关演员的最佳方法是什么?让我们说我有5个演员,其中每个演员都是前演员(父母)的孩子,演员#2有多个孩子。底层的演员#5(演员#1在这个例子中会在顶部)如何能够将一条消息充分传递给一个演员#2的间接相关孩子?

下面的草图:指向代表消息的子actor的箭头

现在我知道这里的演员选择机制可行,但根据官方的Akka文档,除非你正在使用远程处理,否则应该避免使用它。那么,最好是在某个地方持有对Actor#1的全局单例引用并从那里传递消息?如果这个链变得更复杂怎么办?我是否忘记了一些邪恶的设计模式?

如果以前回答了类似的问题,如果您能将我链接到我身上,我会感激不尽。

具体来说,我目前正在使用Java中的Akka。基于Scala的解决方案也很受欢迎。

child actor

2 个答案:

答案 0 :(得分:3)

在这种情况下我使用Actor Selection没有问题,但是docs确实声明在使用refs时最好避免使用Actor Selection。如果您以这种方式从Actor#5向同一个孩子发送许多消息,您可以预先使用Actor Selection来获取带有resolveOne的ActorRef,然后使用该ActorRef进行后续通信。也许是一个合理的妥协。

如果您不想使用Actor Selection,我不会使用全局单例,而是将actorRef作为Actors 3,4和5的构造函数的一部分,以便将引用传递给Actor 5。我认为同样的文件警告反对演员选择给出了替代方案的答案:

  

在所有其他情况下,ActorRef可以在Actor创建期间提供或   初始化,将它们从父级传递给子级或引入   演员通过将他们的ActorRef发送到消息中的其他Actors。

另一种选择是使用发布和订阅机制:http://doc.akka.io/docs/akka/snapshot/scala/event-bus.html

如果儿童演员订阅了频道,则演员#5可以向频道发布消息,而无需知道订阅者的身份。

答案 1 :(得分:0)

我看到两种方式:

  1. 将构造函数中的子ActoRef传递给#5 actor。
  2. 让另一位演员成为“接待员”,该演员将持有所需ActorRef的列表,并将其作为对某些询问信息的回复发送。