使用ActorSelection通配符选择子树中的所有akka actor

时间:2014-07-23 08:31:53

标签: akka wildcard actor

akka文档解释了在使用ActorSelection(http://doc.akka.io/docs/akka/snapshot/general/addressing.html#Querying_the_Logical_Actor_Hierarchy)时如何使用通配符。

以下代码会向/user

下的所有演员直接发送消息
context.actorSelection("/user/*") ! msg

是否可以使用通配符向发件层次结构中的所有后代(不仅是直接子节点)发送消息?我尝试了以下代码,但没有成功:

context.actorSelection("/**") ! msg

1 个答案:

答案 0 :(得分:3)

不,我们不支持“发送给所有后代,无论多深层次”。我觉得这很容易导致意外行为,可能会被滥用。您可以执行类似的操作,但指定搜索的深度,如:

val top = system.actorOf(p, "a")
val b1 = Await.result((top ? Create("b1")).mapTo[ActorRef], timeout.duration)
val b2 = Await.result((top ? Create("b2")).mapTo[ActorRef], timeout.duration)
val c = Await.result((b2 ? Create("c")).mapTo[ActorRef], timeout.duration)
val d = Await.result((c ? Create("d")).mapTo[ActorRef], timeout.duration)

system.actorSelection("/user/a/*/c/*").tell(Identify(6), probe.ref)
probe.expectMsg(ActorIdentity(6, Some(d)))
probe.expectNoMsg(200.millis)

此外,演员选择可能不是你所追求的,而是你可以使用专门用于广播的东西;

您可以使用EventStream并在那里发布广播。

或者,如果您使用的是群集环境,请使用DistributedPubSub extension(此处为激活器模板:akka-clustering (pubsub) activator template