2015-08-03 2 views
0

У меня есть Система Актера, которую я хочу начать и жить до определенного актера, Destructor, получает сообщение ShutdownNow. Когда он получает такое сообщение, он в основном выполняет эквивалент отключения крючка, закрывает всю систему актера вниз, а затем родительский процесс JVM/основной поток завершает работу: Что-то вроде этого:Управление Аккой Система Актеров Lifecycles

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 сообщение соответствующему игроку.

Как это реализовать?

ответ

1

Не зная, что точная настройка вы используете:

Процесс Java не остановится, пока система актер не останавливается. Поэтому вам не нужно ничего делать, но отправьте команду shutdown из вашего исполнителя Destructor.

Следующий код работает для меня (как с остановкой процесса внутри процесса с актером и с внешней стороны убийства):

import java.util.concurrent.TimeUnit; 

import scala.concurrent.duration.Duration; 
import akka.actor.ActorRef; 
import akka.actor.ActorSystem; 
import akka.actor.Props; 
import akka.actor.UntypedActor; 


public class MyApp { 

    public static void main(String[] args) { 
     // Do some stuff before starting the actor system. 
     System.out.println("Start Actor System"); 
     ActorSystem actorSystem = ActorSystem.create("myapp-actorsys"); 
     ActorRef destructor = actorSystem.actorOf(Props.create(Destructor.class)); 

     //Java process won't shut down before actor system stops 
     //Send message after timeout to stop system 

     actorSystem.scheduler().scheduleOnce(Duration.create(10, TimeUnit.SECONDS), 
       destructor, new ShutdownNow(), actorSystem.dispatcher(), null); 
    } 

    public static class Destructor extends UntypedActor { 

     public Destructor() { 

     } 

     @Override 
     public void onReceive(Object msg) { 
      if(msg instanceof ShutdownNow) { 
       //Shutdown system to stop java process 
       System.out.println("Stop Actor System"); 
       getContext().system().shutdown(); 
      } 
     } 
    } 

    public static class ShutdownNow { 

    } 
} 
Смежные вопросы