У меня есть акторная система, которую я хочу запустить и поддерживать до тех пор, пока конкретный актор, Destructor
, не получит сообщение ShutdownNow
. Когда он получает такое сообщение, он в основном выполняет эквивалент хука выключения, отключает всю систему акторов, а затем закрывается родительский процесс/основной поток JVM: Что-то вроде этого:
class MyApp {
static void main(String[] args) {
// Do some stuff before starting the actor system.
ActorSystem actorSystem = ActorSystem.create(“myapp-actorsys”)
ActorRef initializer = actorSystem.actorOf(Props.create(Initializer) “initializer”)
Inbox inbox = Inbox.create(actorSystem)
inbox.send(initializer, new Initialize())
// Now the actor system is initialized and is running
// Maybe its processing data off a message broker, etc.
// Here I’d like to wait until the actor system shuts down (see Destructor below)
while(actorSystem.isRunning()) { }
// Now do some final tasks.
} // <- end of main thread/parent JVM process
}
class Destructor extends UntypedActor {
@Override
void onReceive(Object msg) {
if(msg instanceof ShutdownNow) {
// Shut down the actor system such that actorSystem.isRunning()
// will return true.
}
}
}
Идея заключается в том, что родительский процесс JVM остается активным, если его не прерывает базовая ОС (sigkill и т. д.), или что-то внутри системы акторов не передает сообщение ShutdownNow
соответствующему актору.
Как это реализовать?