2014-12-18 4 views
2

영속 액터의 수신 메소드에서 유지하려는 이벤트를 묶음으로 받고, 모든 이벤트가 지속 된 후에 만 ​​내 상태를 다시 업데이트하십시오. 어떻게해야합니까?모든 이벤트가 지속 된 후에 액터 상태를 업데이트하십시오.

def receive: Receive = { 
    ... 
    case NewEvents(events) => 
    persist(events) { singleEvent => 
     // Update state using this single event 
    } 
    // After every events are persisted, do one more thing 
} 

persist() 호출이 차단되지 않았으므로 코드를 삽입 할 수 없습니다.


업데이트 :이

필요한 이유 이러한 새로운 이벤트가 외부 웹 서비스에서 왔습니다. 내 지속적인 액터는 마지막 이벤트 ID를 상태에 저장해야합니다. 마지막 이벤트 ID는 명령을받을 때 후속 ws 호출에 사용될 것입니다. 것은이 명령이 동시에 올 수 있다는 것이다, 그래서 어떤 잠금 시스템의 종류가 필요합니다

  • 수신 WS 호출 명령이 하나가 완료 될 때까지 숨겨 놓은 다음 명령을 (즉, 요약하면, 부울)
  • 수신 한 응답 ws : 상태를 업데이트하고 마지막 ID를 저장하고, 숨김 상태 인 모든 명령에 대해 다른 단일 ws 호출을 실행합니다 (명령 보낸 사람이 응답 할 수 있도록 유지합니다.) 모든 일을 한 번) 그렇지 않으면 더 이상 명령을 숨기지 않습니다.
+0

'지연'이 목적을 위해 작동합니까? – Ryan

+0

유망 해 보입니다. 나는 이것을 시도 할 것입니다. 감사! – Dimitri

+1

내가 필요로하는 이유가 무엇인지 물어볼 수 있습니까? 어쩌면 거기에 당신의 최종 목표를 설명하는 경우 그것을 달성하는 더 좋은 방법이있다 –

답변

1

나는 아직 defer을 시도하지 않았지만, 초기 해결책은 자신에게 PersistEventsDone 메시지를 보내는 것이 었습니다. persist 메서드는 모든 이벤트 처리기가 실행될 때까지 모든 들어오는 메시지를 숨길 것이기 때문에 작동합니다. 다른 명령이 과정에서 온 경우는 정말 전이나 PersistEventsDone 후인지는 중요하지 않습니다

def receive: Receive = { 
    ... 
    case PersistEventsDone => 
    ... 
    case NewEvents(events) => 
    persist(events) { singleEvent => 
     // Update state using this single event 
    } 
    self ! PersistEventsDone 
} 

defer 내 경우에는 조금 이상한 그것이 내가 필요하지 않은 이벤트를 필요로하기 때문에. 하지만 여전히 내 솔루션보다 더 자연스러워 보입니다.