2015-06-03 70 views
0

我已實現了以下PersistedActorPersistentActor沒有收到命令

import akka.actor._ 
import akka.persistence._ 

object TaskDispatcher { 

    /** 
    * Create Props for the actor 
    */ 
    def props(): Props = Props(new TaskDispatcher()) 

    case class AddEndpoint(serverEndpoint: ActorRef, id: String) 
} 

class TaskDispatcher() extends PersistentActor with ActorLogging { 
    import TaskDispatcher._ 

    override def persistenceId = "task-dispatcher-persistence-ID" 

    // Actor State 
    var endpoints: Map[String, ActorRef] = Map() 


    def receiveRecover: Receive = { 
    case AddEndpoint(serverEndpoint, id) => 
     endpoints += (id -> serverEndpoint) 

    } 

    def receiveCommand: Receive = { 

    case AddEndpoint(serverEndpoint, id) => 
     log.info("AddEndpoint received") 
     persistAsync(AddEndpoint(serverEndpoint, id)) { command => 
     endpoints += (id -> serverEndpoint) 
     } 
    } 

} 

我創建PersistedActor的實例,我通過其他演員

val taskDispatcher = 
    context.actorOf(Props[TaskDispatcher], "task-dispatcher") 
taskDispatcher ! AddEndpoint(self, id) 

發送消息AddEndpoint吧我以前這個演員的非持久版本和一切工作。現在演員不會收到AddEndpoint消息。我注意到它,因爲日誌不打印「AddEndpoint收到」消息。我究竟做錯了什麼?

+0

您正在使用哪種期刊?你確定它正在工作(數據庫可用等)? –

+0

我正在使用MongoDb。我不知道我正在使用哪種日記。我如何檢查它?不過,我嘗試從類型安全下載的ExamplePersistentActor,它似乎工作。 –

+0

你包括哪些依賴關係將akka連接到mongo,ironfish(https://github.com/ironfish/akka-persistence-mongo)? –

回答

1

也許剛剛恢復不啓動。嘗試的地方:

override def preStart() = { 
    self ! Recover() 
} 
+0

現在,它的工作原理!謝謝!你知道爲什麼我應該在preStart()裏面發送Recover?通過閱讀文檔,我明白恢復在失敗後開始(例如,actor拋出異常)。但在這種情況下,不會拋出異常。我誤解了文檔嗎? –

+0

當持久性actor被創建時(可能在失敗後)恢復,並基於其persistenceId。 –

+0

@MattiaMicomonaco,持久性actor將其保存在磁盤上並在啓動或重新啓動後(故障後)將其恢復。它只是從磁盤中逐個讀取所有保存的消息,並通過'receiveRecover'發送它們。文件說,恢復自動開始,但在你的情況下,它不會發生(我不知道爲什麼)。如果你不需要恢復,只需寫'override def preStart()= {}'。我不知道如何在啓動'TaskDispatcher'後恢復'ActorRef'。我認爲,這是行不通的。 – sheh