2015-02-04 2 views
1

с помощью AKKA актера - Я посылаю тяжелую скорость сообщений актера, который обновляет его состояниеКак я могу проверить, завершен ли процесс сохранения, чтобы изящно завершить работу системы?

for (i <-0 to 100000){ 
    persistentActor ! Cmd("foo"+i) 
} 

и используя persistAsync как этого

val receiveCommand: Receive = { 
    case Cmd(data) => 
     persistAsync(Evt(s"${data}-${numEvents}"))(updateState) 
    case "snap" => saveSnapshot(state) 
    case "print" => println(state) 
    } 

как я могу убедиться в том, что процесс живучести завершен чтобы изящно закрыть систему?

ответ

2

Ваш актер получит подтверждение после настойчивости снимки,:

var count = 0 
var shutdown = false 
def checkShutDown() = if (shutdown && count == 0) context stop self 

def receive = { 
    case "snap" => count++; saveSnapshot(state) 
    case SaveSnapshotSuccess(metadata)   => 
     count --; checkShutDown() 
    case SaveSnapshotFailure(metadata, reason) => 
     count --; checkShutDown() 
    case ShutDown => 
     shutdown = true; checkShutDown() 
} 

И, наконец, вы можете использовать The Reaper pattern для завершения работы системы после завершения работы актеров.