2016-08-14 74 views
7

我試圖將數據保存到數據庫中。我堅持的方法是異步的。處理Akka actor的接收方法內異步調用的最佳方法

class MyActor(persistenceFactory:PersistenceFactory) extends Actor { 
    def receive: Receive = { 
    case record: Record => 
     // this method is asynchronous, immediate return Future[Int] 
     persistenceFactory.persist(record) 
    } 
} 

瓶頸是這裏要麼我們得到內存不足或者當應用程序在增加的負載下運行時沒有線程可用。

那麼在Akka actor的接收方法中處理異步調用的最佳方式是什麼?

+0

什麼是堅持做?它接受隱式的'ExecutionContext'嗎? –

+0

不,它有自己的ExecutionContext。 – Sky

+0

它如何創建一個'ExecutionContext'?你能顯示代碼嗎? –

回答

1

這是一個很好的例子,你應該讓演員創建另一個演員來處理交互。基本上流量是這樣的,如果它使你更容易,你也可以使用FSM(有限狀態機)。

  1. 家長演員收到消息
  2. 家長角色建立子事務演員
  3. 家長髮送孩子的原始消息
  4. 孩子叫異步方法和存儲未來
  5. 孩子使用成爲()改變其行爲等待未來的完成。有很多方法可以做到這一點,包括FSM。
  6. 兒童schedules periodic messages to itself檢查未來
  7. 孩子的新行爲檢查以後如果它是完整的每個接收
  8. 在未來完成後,孩子可以與結果回覆給父母或原來的發送者(如果父母用原始發件人轉發郵件)。
+0

大概我們可以在未來將一個'onComplete'回調函數註冊到子actor。 –

+0

當然,我在考慮Java不是未來的Java或未來的Java 8可以完成的未來。儘管回調有一個缺陷。你仍然希望孩子發送超時消息給自己,以防將來的執行者發生事情。 – dres