2016-04-15 8 views
2

私は永続的な俳優を持っています。最初(データベースが空である)に開始するとき、私はいくつかの初期データを保持します。しかし、状態は私が期待するように更新されません。最初のメッセージが処理された後で更新されます。状態の更新後に俳優にメッセージの処理を開始させる方法を教えてください。あなたは再考したいAkkaは最初のメッセージの後に回復完了の更新状態を維持します

俳優コード

class TestActor extends PersistentActor { 
    var numberOfEvents = 0 

    def updateState(e: Any): Unit = { 
    println("updating") 
    numberOfEvents += 1 
    } 

    override def receiveRecover: Receive = { 
    case RecoveryCompleted => 
     if (numberOfEvents == 0) { 
     println("persisting") 
     persist("foo")(updateState) 
     } 
    } 

    override def receiveCommand: Receive = { 
    case _ => { 
     println("answering") 
     sender ! numberOfEvents 
    } 
    } 
} 

テストコード

Await.result(actorRef ? "stats", Duration.Inf) shouldBe 0 // I wan't 1 here 
Await.result(actorRef ? "stats", Duration.Inf) shouldBe 1 

出力

persisting 
answering // why this goes before updating? 
updating 
answering 

Full code

答えて

1

ことの一つは、あなたが一般的ではないだろうということですRecoveryCompletedイベントの状態を更新するのではなく、状態を再構成するために永続化したイベントを処理します。 RecoveryCompletedメッセージは、回復の最後に何をすべきかを処理するためのメッセージです。これらのイベントは、保存したジャーナルから再生されたイベントになります。スナップショットを使用している場合は、オプションでスナップショットイベントも取得します。例えば

override def receiveRecover: Receive = { 
    case Added(num) => 
     updateState(num) 

    case SnapshotOffer(metadata, snapshot) ⇒ 
     // Restore your full state from the data in the snapshot 

    case RecoveryCompleted => 
     println("Recovery completed") // use logger here 
    } 

receiveCommand、一方、着信コマンドを処理するために使用され、それらのイベントが更新された後の内部状態を更新し、それらのイベントを持続します。

私はあなたが以下を参照することができますよう、それは便利なコマンドの過去形などのイベントに名前を見つけるメッセージングの面では
override def receiveCommand: Receive = { 
    case Add(num) => { 
     println("received event and persisting") 

     persist(Added(num){ evt ⇒ 
     // This gets called after the persist succeeds 
     updateState(num) 
     sender ! numberOfEvents 
     }  
    } 
    } 

def updateState(e: Int): Unit = { 
    println("updating") 
    numberOfEvents += e 
    } 

//イベント

ケースクラスを追加しました(V:のInt )

//コマンド

ケースクラスの追加(V:INT)

うまくいけば、これで少し明確になります。

関連する問題