2013-08-19 91 views
1

如果这是一个重复的问题,请道歉。Akka:从一名演员转发到另一名演员

我是AKKA的新手,并试图扩展akka-java-spring示例代码以添加另一个actor并拥有一个不可变对象Counter用作要发送给CoutingActor的消息,该消息打印消息并将其转发给一个PrintMessageActor(新演员)。如何将消息从CoutingActor转发给PrintMessageActor。在这种情况下,如何使用文档中的以下片段来使用它。

target.forward(result, getContext()); 

如何获得第一个演员的目标(第二个演员)?

回答

1

如果我正确理解你的问题,你想知道转发角色从哪里知道它应该转发的目标?

两种可能性:

1)如果在转发演员得到体现目标的演员已经存在,那么你可以简单地传递它通过构造函数或在消息目标的ActorRef。有关如何使用自己的参数创建自定义Props实例,请参阅Props文档。 2)如果目标在创建转发器时不存在,但其在ActorSystem中的路径已经清除(例如“/ user/PrintMessageActor”),则可以传递ActorSelection。如果此路径中的Actor存在于给定的ActorSystem中,则ActorSelection可以解析为ActorRef。优选的是第二个选项,因为如果底层角色死亡,ActorRef将是无效的。另一方面,ActorSelection将解析为此路径上Actor可能的新的化身。

+0

谢谢比约恩。我会尝试使用第二个选项。我也想为CoutingActor和PrintMessageActor创建子actor。在父母角色中如何创建子动作者以及子角色如何处理消息? 我想要做的是 - 传递消息给CoutingActor - 这个actor的孩子打印一条消息,然后消息被传递给PrintMessageActor - 它有孩子,他们打印一条消息。我也想控制父母演员可以拥有的儿童人数。如果您能指出我朝着正确的方向,我将不胜感激。 – Sachin

+0

Hallo Sachin。您可以根据需要创建尽可能多的儿童演员。创建一级演员和小孩演员之间唯一的区别就是为您创作的对象。如果你想创建一个第一级的actor(比如“/ user/MyActor”),那么你直接使用ActorSystem,比如说ActorRef的system.actorOf(...)或者ActorSelection的system.actorSelection(...) 。可以使用ActorContext从Actor中创建子actor。 (context.actorOf/.actorSelection) –

+0

(续)发送所有孩子相同的消息(广播)可以通过两种方式实现。您可以迭代父代actor的“children”属性,向他们发送所有相同的消息 - 或者使用称为Router的特殊类型的中介actor。该路由器有几种不同的实现方式,一种是适合您需求的BroadcastRouter。但在这样一个简单的情况下,我个人更喜欢只是迭代孩子。 –