2015-04-06 51 views
5

我使用ActorPublisher作爲Akka-Stream Source。我無法弄清楚如何預測輸入參數的名稱,以便從應用程序的其他部分發送消息。我在我的實例源像這樣:有沒有辦法讓Akka-Stream獲得可預測的演員命名?

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

我得到一個ActorRef當我兌現流,而是動態地生成它的路徑,它僅使用我提供的名稱作爲代碼生成流程的一部分以中心命名的方案。

有沒有辦法讓這個前端actor有一個明確的名字,還是我堅持傳遞ActorRef?

如果我不能明確地命名它,這是否意味着您不能直接使用遠程處理來使用Akka-Stream?

編輯:我現在可以使用相對尋路找到我的演員,但我仍然需要弄清楚如何命名我的Flow所以我能夠理解問題的完整路徑演員將是什麼。

編輯:(阿卡版本信息下面,斯卡拉2.11.6)

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

編輯:友好的鄉親在阿卡用戶的谷歌組都開導我,並建議適當的解決這個問題的方法是傳遞ActorRef,這是runWith()致電本身而不是使用.actorSelection()。如果我發現這種情況在未來發生變化,我會更新這個問題。謝謝閱讀。

回答

1

好的方法來解決這個問題,將添加具有特定路徑的組路由器,然後你可以告訴路由器哪裏可以找到你的演員(路線)。

通過這樣做,您將解耦您具體的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) 
+0

這是抽象演員的好方法,但我需要的是能夠解析演員的路徑。爲此,您的解決方案與共享ActorRef沒有區別。但不管怎麼說都好。 –

+1

另一個解決方案可以是在ActorSelection下發送Identify消息給參與者,並偵聽包含ActorRef的ActorIdentity回覆。如果您願意,您還可以創建自定義消息。據我記得,Flow會像前綴一樣擁有你的名字,比如任務監聽器*。 – YoK

+0

關於命名,如果您使用ActorFlowMaterializer,您可以看到演員是如何命名的,並且通過向Materializer自身提供自定義前綴來控制此演員的前綴。在這裏尋找更多信息 - http://doc.akka.io/api/akka-stream-and-http-experimental/1.0-M5/index.html#akka.stream.ActorFlowMaterializer。 – YoK

相關問題