2016-08-06 2 views
2

데이터베이스에서 액터 상태를 초기화해야 할 때 패턴을 물어보고 싶습니다. 나는 Future [...]를 반환하는 DAO를 가지고 있으며, nonblocking 메시지가 될 normaly는 미래의 완성에 대해 배우에게 보내야한다. 그러나이 경우는 다릅니다. 초기화가 완료되기 전에 액터 사서함에서 메시지를받을 수 없습니다. 데이터베이스가 완료 될 때까지 기다리는 동안 액터 스레드를 차단하는 유일한 방법입니까?Akka 액터가 데이터베이스에서 상태를 읽습니다.

답변

3

가장 간단한 방법은 두 가지 수신 방법을 정의하는 것입니다. initializinginitialized이고, def receive = initializing으로 시작합니다. inizializing 컨텍스트 내에서 InitializationNotReady과 같은 메시지를 보내면 다른 배우에게 나중에 다시 시도해야한다고 알릴 수 있습니다. 액터가 초기화 된 후 context become initialized으로 컨텍스트를 전환하면 정상적으로 작동 할 수있는 새 상태가됩니다.

결국 또 다른 좋은 방법은 Akka Persistence입니다. Stateful 액터는 내부 상태를 유지하여 액터가 시작되거나 JVM 충돌 후 다시 시작되거나 감독자에 의해 다시 시작되거나 클러스터에서 마이그레이션 될 때 복구 할 수 있습니다.

이 경우 Akka 지속성을위한 여러 저장 옵션이 있으므로 데이터베이스에서 상태를 복원 할 수 있습니다. 당신은 그들을 here 찾을 수 있습니다. 회복 후, 익숙해 진 것처럼 메시지를받을 수 있습니다.

+0

내 경우에는 Akka 지속성이 좋아 보이지만 스냅 샷에는 이벤트 소싱 및 추가 저장 장치가 필요하지 않습니다. 내 전표에서 스냅 샷을 읽고 싶습니다. 가능합니까? 액터 상태가 내 유스 케이스와 일치하지 않기 때문에 메시지가 별도의 액터가 아닌 일반 코드 (화재 및 잊어 버림)에서 전송됩니다. – user2860204

+1

그렇다면'stash'가 도움이 될 수 있습니다. 액터를 시작할 때 모든 들어오는 메시지를 숨길 수 있습니다. 초기화가 완료된 후에는 수신 된 모든 메시지의 잠금을 해제하여 지금 수신 한 것처럼 보입니다. stashing에 대해 http://doc.akka.io/docs/akka/current/scala/actors.html#Stash 문서에서 읽을 수 있습니다. –

관련 문제