我在scala中使用Play框架。我是斯卡拉,阿卡和玩的新手。鏈接Akka Actor詢問呼叫的正確方法是什麼?
這是我的演員系統。我不確定我是否做得對,但我有兩臺路由器。 1男演員A,和1對演員B:
val system = ActorSystem("ActionSystem")
val actorARouter = system.actorOf(Props[ActionParser].withRouter(
SmallestMailboxRouter(Runtime.getRuntime.availableProcessors())), name = "actorARouter")
val actorBRouter = system.actorOf(Props[ActionDispatcher].withRouter(
SmallestMailboxRouter(Runtime.getRuntime.availableProcessors())), name = "actorBRouter")
這是當前的設置,我有: 該劇框架提供了我,收到了一些JSON一個HTTP REST調用的控制器。每當控制器接收一個REST調用,我做了一個請發送JSON爲演員A.這裏路由器是什麼樣子:
(actorARouter ? request.body.asJson.get).map {
case m: controllers.HttpMessages.OK => Ok(m.body)
case m: controllers.HttpMessages.HttpResponse => Status(m.status)(m.body)
}
演員A然後解析成JSON對象的序列,然後發送他們通過詢問演員B.演員B應該最終通過發送給其他演員來處理這些演員,但現在只是返回通用響應。
ActorA通過未來接收到通用響應,然後解析爲JSON,然後通過OK響應返回給Controller ...或者至少這是應該發生的事情。
發生了什麼事: 所以發生了什麼事是控制器發送到ActorA,ActorA發送到ActorB。 ActorB向ActorA發送通用響應。 ActorA將通用響應解析爲JSON,並嘗試執行sender ! OK(json)
,但我在控制檯中收到一條消息,稱它並未傳遞,因爲它是「死信」。當我調試到它時,我看發件人,發件人是對演員的參考akka://ActionSystem/deadLetters
我的問題:
- 很顯然,我做錯了什麼。也許我不應該像這樣一起鏈接這些演員的反應。我再次提到,我只有計劃通過讓ActorB向其他演員發送請求來進一步提高這一點。
- 當我在一個演員中問一個問題時,那不會妨礙那個線程,並在等待響應時阻止它處理其他消息嗎?
編輯: 我發現我可以保存到發件人供以後使用的參考,然後發送到,這似乎解決了一紙空文問題。但我仍然很不確定這是否是正確的做法。感覺就像每次添加另一層演員時,我的響應時間都會添加10毫秒的毫秒數。也許這是由於其他因素。
感謝您的回覆。基本上,當我最終得到對ActorA的響應時,發件人指向地址「akka:// ActionSystem/deadLetters」。在我提出問題之前,我可以通過執行val savedSender = sender來解決此問題,並對savedSender進行響應。 – spierce7