2016-04-06 6 views
1
case class State(id: Long, remain: Int) { 
    def take(t: Take) = copy(remain = remain - t.amount) 
} 

object StateService { 
    def getInitState(id: Long): Future[State] 
} 

sealed trait Evt 
case class Init(id: Long) extends Evt 
case class Take(id: Long, amount: Int) extends Evt 

class FooActor extends PersistentActor { 
    var state: State 

    def receiveCommand = { 
    case Init(id) => ??? // how to 
    case t: Take => persistAsync(t) {case e => state = state.take(t)} 
    } 
} 

object FooActor { 

} 

をinitにpraticeをお勧めしますが、私は他のコマンドを受け入れる前に、俳優の状態を初期化できるかアッカは、一例として、 `PersistentActor`

を説明しましたか?

+1

私はあなたの質問を得ることはできないと思います。どうしてあなたは 'State' varを守りたいのですか?イベントと更新メソッドで 'persist'メソッドを呼び出すことができます。それは世話をすることになりますか、何か不足していますか? –

+0

@endeNeu 'state'は' futher'用に計画されています。例では – jilen

答えて

3

あなたは異なる動作を使用することができます。

case class State(id: Long, remain: Int) 

object StateService { 
    def getInitState(id: Long): Future[State] 
} 

sealed trait Evt 
case class Init(id: Long) extends Evt 

class FooActor extends PersistentActor { 
    var state: State 

    import akka.pattern.pipe 

    def notInitialized: Receive = { 
    case Init(id) => 
     // for simplicity, failure is not handled 
     StateService.getInitState(id) pipeTo self 
    case st: State => 
     state = st 
     context become initialized 
    } 

    def initialized: Receive = { 
    case _ => // meh 
    } 

    def receiveCommand = notInitialized 
} 

object FooActor { 

} 

あなたもinitialized行動(例えばinitialized(state))にパラメータとして渡すことで完全に可変状態を削除することができます。 公式アッカのドキュメントからの回復を、に関する:

それは(context.becomeで 通常の処理およびリカバリ中にさまざまなコマンドハンドラを切り替えることも可能です)と context.unbecome()。 の復旧後に俳優を同じ状態にするには、 と同じ状態を実行するために特に注意する必要があります。のように、receiveRecoverメソッドでは、コマンドハンドラで行ったはずです。 をreceiveRecoverから使用しても、イベントを再生するときにはreceiveRecover の動作のみが使用されます。再生が完了すると、 は新しい動作を使用します。

+0

を更新しました。 'context.become'は' recovery'プロセスに影響しますか? – jilen

+0

回復中に 'context.become'を安全に使用して、アクターの初期動作を設定することができます。編集を参照してください。 – ale64bit

関連する問題