Implementei o desligamento gracioso para meu aplicativo e estou fazendo um teste para garantir que ele esteja funcionando conforme o esperado. A última mensagem que deve aparecer no console deve ser "Concluído!". No entanto, esse não é o caso.
@Service
public class MyClass {
private boolean keepRunning = true;
@Async
public void myMethod(){
do {
try {
System.out.println("Start");
Thread.sleep(10000);
System.out.println("Done!");
}catch (Exception e){
logger.error(e.getLocalizedMessage());
}
} while(keepRunning);
}
@PreDestroy
void stop() {
System.out.println("Shutdown called!");
this.keepRunning = false;
}
}
Também adicionei server.shutdown=graceful
ao meu arquivo application.properties
Esta é a saída completa do console ao finalizar o aplicativo
Start
2024-11-09T12:58:52.932-05:00 INFO 7374 --- [myapp] [ionShutdownHook] o.s.b.w.e.tomcat.GracefulShutdown : Commencing graceful shutdown. Waiting for active requests to complete
2024-11-09T12:58:52.935-05:00 INFO 7374 --- [myapp] [tomcat-shutdown] o.s.b.w.e.tomcat.GracefulShutdown : Graceful shutdown complete
Shutdown called!
Process finished with exit code 1
O processo não deveria esperar o loop terminar? Se não, há alguma maneira de eu esperar o loop terminar antes de fechar o aplicativo?
EDITAR:
Após implementar um taskExecutor personalizado como o abaixo
@Bean(name = "test")
public ThreadPoolTaskExecutor taskExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(1);
executor.setMaxPoolSize(1);
executor.setWaitForTasksToCompleteOnShutdown(true);
executor.setThreadNamePrefix("test-");
executor.initialize();
return executor;
}
Também dei a ele o prefixo de nome "test-" para garantir que o método o esteja usando. Também fiz alterações no método
@Async("test")
public void myMethod(){
do {
try {
System.out.println("Start " + Thread.currentThread().getName());
Thread.sleep(10000);
System.out.println("Done!");
}catch (Exception e){
logger.error(e.getLocalizedMessage());
}
} while(keepRunning);
}
O aplicativo ainda termina antes de imprimir a mensagem "Concluído!"
Start test-1
2024-11-09T14:23:18.132-05:00 INFO 14449 --- [myapp] [ionShutdownHook] o.s.b.w.e.tomcat.GracefulShutdown : Commencing graceful shutdown. Waiting for active requests to complete
2024-11-09T14:23:18.137-05:00 INFO 14449 --- [myapp] [tomcat-shutdown] o.s.b.w.e.tomcat.GracefulShutdown : Graceful shutdown complete
Shutdown called!
Você precisa definir um período de tempo limite para aguardar a conclusão do thread atual.
adicione as propriedades abaixo:
Usar o desligamento gracioso com seu IDE pode não funcionar corretamente se não enviar um sinal SIGTERM adequado. Veja a documentação do seu IDE para mais detalhes.
Para o desligamento chamado você pode adicionar o atuador:
construir.gradle:
adicione as propriedades abaixo para o acutuator:
você precisa definir shutdown.enable para obter o ponto de extremidade de desligamento do atuador
depois de chamar o MÉTODO POST: http://{HOST}:{PORT}/{CONTEXT_PATH}/actuator/shutdown
você receberá uma resposta como a abaixo:
Conforme explicado aqui , para evitar a interrupção de tarefas assíncronas em execução, você precisa especificar o
TaskExecutor
bean para aguardar a conclusão das tarefas (com o método `setWaitForTasksToCompleteOnShutdown):