2016-07-08 3 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)) 

를 보내고 나중에 당신은 아마 이동하는 것을 고려한다 상태

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

을 변경 발생 될() 당신이 원하는 경우 pipeTo (자기) 배우가를 수신하기 전에 waitForValidation 상태 메시지 :

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

메시지를 파이핑하면 큐에 넣을 것이고 객체가 처리되기까지 객체는 새로운 상태 여야합니다. 그러나 필자가 보았던 대부분의 예제는 파이핑되기 전에 호출됩니다. 안전한면에.