将ActorRef传递给其他Actors好坏?

时间:2014-07-19 12:53:02

标签: scala design-patterns akka actor anti-patterns

我试图弄清楚我将Akka ActorRef传递给其他演员的用法是不是反模式。

我的系统中有一些演员。有些是长寿的(restClientRouterpublisher),有些人在完成工作后死亡(geoActor)。短命的演员需要向长寿演员发送信息,因此需要他们ActorRef

  //router for a bunch of other actors
  val restClientRouter = createRouter(context.system)

  //publishers messages to an output message queue
  val publisher: ActorRef = context.actorOf(Props(new PublisherActor(host, channel)), name = "pub-actor")     

  //this actor send a message to the restClientRouter and then sends the response
  //to the publisher 
  val geoActor = context.actorOf(Props(new GeoInferenceActor(restClientRouter, publisher)), name = "geo-inference-actor")

正如您所看到的,我将ActorRefs(restClientRouterpublisher)传递给GeoInferenceActor的构造函数。这样可以吗?有没有更好的方法呢?

2 个答案:

答案 0 :(得分:23)

有几种很好的方法可以将actor引入“需要它们的actor实例”。

1)使用构造函数args需要的refs创建actor(这就是你正在做的事情)

2)在创建实例后通过消息传入所需的引用

您的解决方案完全可以接受,甚至由Akka的技术负责人Roland Kuhn在这篇文章中建议:

Akka actor lookup or dependency injection

答案 1 :(得分:17)

完全有效,如Akka API documentation中所述:

  

ActorRefs可以通过消息传递在actor之间自由共享。

在你的情况下,你将它们传递给构造函数,绝对很好以及它应该是这样的。