2015-07-08 15 views
6

Problem polega na tym, że zatrzymuję aplikację Dropwizard (przez ctrl + c) i włożyłem Hook Shutdown do głównej klasy, aby zrobić kilka rzeczy przed zamknięciem. Ale teraz ServerConnector dla aplikacji jest zamknięty, zanim będę mógł zrobić to, co chcę zrobić.Dropwizard Shutdown Hook

Istnieje serwis wyborczy (sonduje jeden z moich zasobów) i muszę im powiedzieć, że aplikacja wkrótce się zawiesi, aby zapobiec pewnym problemom. Potrzebuję co najmniej 15 sekund, zanim ressource przejdzie w dół.

Jakiś pomysł, jak rozwiązać ten problem?

Odpowiedz

6

Dodaj Dropwizard Task, który zmieni stan pola statycznego (lub jakkolwiek chcesz przekazać dane), którego zasób głosowania użyje do udzielenia odpowiedzi.

public class ShutdownTask extends Task { 
    private int timeoutSeconds; 

    public ShutdownTask (int timeoutSeconds) { 
     super("shutdown"); 
     this.timeoutSeconds = timeoutSeconds; 
    } 

     @Override 
    public void execute(ImmutableMultimap<String, String> parameters, PrintWriter output) throws Exception { 
     // you probably can take the timeout parameter from the request via 'parameters' instead of the constructor. 
     PollingResource.shuttingDownIn = timeoutSeconds; 
    } 
} 


environment.admin().addTask(new ShutdownTask(15)); 

Następnie napisać skrypt bash, który zawija do zadania

curl -X POST http://dw.example.com:8081/tasks/shutdown 

oraz:

  • Prawdopodobnie nie jest to zalecane (ludzie nie lubią System.exit(0)), ale można dodać wykonując następujące czynności:

Thread.sleep(timeoutSeconds * 1000); System.exit(0)

  • Lub czekaj i zabij aplikację dropwizard w skrypcie basha.

kill -SIGINT <pid>

+0

Tak thats teraz tak, jak to zrobić, ale administrator serwera lub polecenia zatrzymania usługi linux nadal będzie zatrzymać aplikację w „starym stylu”. Usługa ressource zostanie natychmiast zamknięta i nie mam pojęcia, jak to naprawić. – heaphach

+0

Tak, więc pomysł uruchomienia zadania polega na umieszczeniu serwera w stanie "zamknięcia", aby zasoby były nadal dostępne. A następnie czekać na n sekund, gdy serwer jest w tym stanie, a następnie zatrzymać usługę. – Natan

+0

Ale jeśli ctrl + c, ressource wciąż spada i chcę temu zapobiec dokładnie :-) – heaphach

2

Można użyć haka zarządzać cyklem życia do pewnych zasobów.

public class ManagedObject implements Managed { 

    private final Object obj; 

    public ManagedObject(Object obj) { 
     this.obj = obj; 
    } 

    @Override 
    public void start() throws Exception { 
     // Do something to start the object 
    } 

    @Override 
    public void stop() throws Exception { 
     // Do something to stop the object 
    } 
} 

Następnie zarejestrować się na środowisku

ManagedObject myManagedObject = new ManagedObject(obj); 
environment.lifecycle().manage(myManagedObject);