2016-07-08 6 views
0

最初に俳優が状態変更についてのメッセージを送り、後で本当にこの状態に変更されたことに気付きました。あたりです?ここでActorContextの変更順

class MyActor extends Actor { 
    def receive = idle(Set.empty) 

    def idle(isInSet: Set[String]): Receive = { 
    case Add(key) => 
     // sending the result as a message back to our actor 
     validate(key).map(Validated(key, _)).pipeTo(self) 

     // waiting for validation 
     context.become(waitForValidation(isInSet, sender())) 
    } 

    def waitForValidation(set: Set[String], source: ActorRef): Receive = { 
    case Validated(key, isValid) => 
     val newSet = if (isValid) set + key else set 
     // sending acknowledgement of completion 
     source ! Continue 

は通知

 // go back to idle, accepting new requests 
     context.become(idle(newSet)) 

以降は、あなたが俳優を受信したい場合は、おそらくpipeTo(自己)の前に)(になるの移行を検討すべき状態

case Add(key) => 
     sender() ! Rejected 
    } 

    def validate(key: String): Future[Boolean] = ??? 
} 

// Messages 

case class Add(key: String) 
case class Validated(key: String, isValid: Boolean) 
case object Continue 
case object Rejected 

答えて

0

を変更送信が発生しますwaitForValidation状態のメッセージ:

context.become(waitForValidation(isInSet, sender())) 
validate(key).map(Validated(key, _)).pipeTo(self) 

メッセージをパイプしてキューに入れることに同意します。オブジェクトが処理されるまでに、オブジェクトは新しい状態になるはずですが、私が見た例のほとんどは、安全面で

関連する問題