2016-04-18 15 views
6

Abbiamo un'applicazione Spring Boot multithread, che gira su un computer Linux come demone. Quando provo ad arrestare l'applicazione dall'avvio daemon-stop-come questoCome arrestare con grazia un'applicazione Spring Boot da start-stop-demone

start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --pidfile $PIDFILE --name $NAME 

Il segnale SIGTERM viene inviato e l'applicazione finisce immetiately. Comunque voglio che l'applicazione attenda, fino a quando ogni thread finisce di funzionare.

C'è un modo, come gestire ciò che accade quando viene ricevuto il segnale SIGTERM?

+0

Se siete interessati a chiudere il servlet container incorporato con grazia, si prega di consultare [questo tema Primavera Boot] (https://github.com/spring-projects/spring-boot/issues/4657). –

risposta

13

L'app Spring Boot registra un hook di arresto con JVM per garantire che ApplicationContext venga chiuso correttamente all'uscita. Crea bean (o bean) che implementa DisposableBean o ha metodo con annotazione @PreDestroy. Questo bean verrà richiamato all'arresto dell'app.

http://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/#boot-features-application-exit

+1

Grazie per il suggerimento. Tuttavia, questo non risolve il mio problema, perché in qualche modo devo intercettare il segnale SIGTERM e aspettare fino a quando l'applicazione termina il suo lavoro. Questo mi permette di fare un po 'di pulizia, ma se ho capito bene, questo non mi permette di impedire la terminazione del metodo attualmente in esecuzione. – Michal

+0

@Michal Hai ragione, non ti consente di impedire la risoluzione. Ma permette di implementare i thread fermando la logica e attendere che i thread finiscano. La JVM non verrà terminata se il gancio di arresto funziona. – Evgeny

+0

Vorrei darti un vantaggio 2, ma posso solo dare 1 ... –