2013-02-22 4 views
6

Domyślnie Akka wyłącza system (-y) aktorów po otrzymaniu SIGTERM. Jak mogę przesłonić to zachowanie, aby wykonać niestandardową logikę zamykania przed zamknięciem systemu akka? Mam już tę logikę zaimplementowaną u aktorów, używając specjalnych wdzięcznych komunikatów stopu - po prostu muszę wywołać tę logikę, gdy otrzymam SIGTERM.Jak wykonać niestandardowe wyłączenie urządzenia SIGTERM za pomocą Akki?

Czy muszę użyć innego sposobu wyłączenia aplikacji? To także opcja.

Odpowiedz

1

można po prostu użyć sys.shutdownHookThread takiego:

def main(args: Array[String]) { 
    ... initialization code ... 
    sys.shutdownHookThread { 
    println "Shutting down ..." 
    shutdownHandler ! DoSomething 
    } 
} 
+0

Czy to na pewno uruchomić zanim system aktor jest wyłączony? –

+1

Nie widzę żadnej dokumentacji, która tak mówi, ale działa dla nas. –

+3

Czytając kod źródłowy i Javadoc, wygląda na to, że nie ma gwarancji co do kolejności, w której będą uruchamiane haki zamykające, więc nie, nie zawsze będzie działać we właściwym czasie. Na przykład w jednej wersji Java może działać, ale w innej wersji kolejność może się zmienić i może nie działać. Lub haki zamykające mogą być uruchamiane jednocześnie. –

0

Czy to pasuje: http://doc.akka.io/api/akka/2.1.0/#akka.actor.ActorSystem

 
abstract def 
registerOnTermination(code: Runnable): Unit 
Register a block of code (callback) to run after ActorSystem.shutdown has been issued and all actors in this actor system have been stopped. Multiple code blocks may be registered by calling this method multiple times. The callbacks will be run sequentially in reverse order of registration, i.e. last registration is run first. 
Exceptions thrown 
a 
RejectedExecutionException if the System has already shut down or if shutdown has been initiated. 


abstract def 
registerOnTermination[T](code: ⇒ T): Unit 
Register a block of code (callback) to run after ActorSystem.shutdown has been issued and all actors in this actor system have been stopped. Multiple code blocks may be registered by calling this method multiple times. The callbacks will be run sequentially in reverse order of registration, i.e. last registration is run first. 
Exceptions thrown 
a 
RejectedExecutionException if the System has already shut down or if shutdown has been initiated. 


+0

Problem polega na tym, że wszystkie podmioty zostały zamknięte przez ten punkt, więc nie sądzę, że dane, które były w nich, będą już dostępne. Hmmm ... Przypuszczam, że mógłbym zrzucić dane do specjalnego obiektu "na zewnątrz" systemu aktorów w postStop, a następnie odebrać dane z tego wywołania zwrotnego, ale to jest trochę niezręczne. Myślę, że zmiana skryptu, który uruchamia i zatrzymuje aplikację na użycie czegoś innego niż SIGTERM (na przykład Linux fifo), będzie najłatwiejszą metodą. –