有没有办法用Akka-Stream获得可预测的演员命名?

时间:2015-04-06 17:53:48

标签: scala akka akka-stream

我正在使用ActorPublisher作为Akka-Stream Source。我无法弄清楚如何可预测地命名输入actor,以便我可以从我的应用程序的其他部分发送消息。我正在实例化我的源代码:

val src = Source[Task](Props(classOf[TaskListener], this), "task-listener")

当我实现流时,我得到ActorRef,但它的路径是动态生成的,它只使用我提供的名称作为代码生成的以流为中心的命名方案的一部分。

有没有办法让这个前端演员源有一个明确的名称或者我是否卡住了传递ActorRef?

如果我无法明确指出它是否意味着您不能直接使用Akka-Stream进行远程处理?

编辑:我现在可以找到我的演员使用相对路径,但我仍然需要弄清楚如何命名我的Flow所以我可以理解演员的完整路径是什么问题是。

编辑:(以下akka版本信息,scala 2.11.6)

"com.typesafe.akka" %% "akka-actor" % "2.3.9"
"com.typesafe.akka" %% "akka-stream-experimental" % "1.0-M4"

编辑: akka用户google小组的友好人士已经开悟了我,并建议处理此问题的正确方法是绕过ActorRef来自runWith()调用本身并且不使用.actorSelection()。如果我发现这种状况将来会发生变化,我会更新这个问题。谢谢你的阅读。

1 个答案:

答案 0 :(得分:2)

解决这个问题的好方法是,添加具有特定路径的Group路由器,然后你可以告诉路由器它可以找到你的演员(路由)。

通过执行此操作,您将解耦具体的actor组并通过路由器维护到源池的单一入口点。此外,您将能够在将来识别此路由器群集。

您还可以查看ActorFlowMaterializer - http://doc.akka.io/api/akka-stream-and-http-experimental/1.0-M5/index.html#akka.stream.ActorFlowMaterializer本身。您可以在源代码中找到此评论:

/** The `namePrefix` is used as the first part of the names of the actors running
  * the processing steps. The default `namePrefix` is `"flow"`. The actor names are built up of
  * `namePrefix-flowNumber-flowStepNumber-stepName`.
  */
def create(settings: ActorFlowMaterializerSettings, context: ActorRefFactory, namePrefix: String): ActorFlowMaterializer =
apply(Option(settings), Option(namePrefix))(context)