Como posso desligar programaticamente um aplicativo Spring Boot sem encerrar a VM ?
Em outras obras, o que é o oposto de
new SpringApplication(Main.class).run(args);
java
spring
spring-boot
Axel Fontaine
fonte
fonte
Respostas:
Fechar um
SpringApplication
significa basicamente fechar o subjacenteApplicationContext
. OSpringApplication#run(String...)
método fornece issoApplicationContext
como umConfigurableApplicationContext
. Você pode então fazerclose()
isso sozinho.Por exemplo,
Como alternativa, você pode usar o
static
SpringApplication.exit(ApplicationContext, ExitCodeGenerator...)
método auxiliar para fazer isso por você. Por exemplo,fonte
ExitCodeGenerator
pode ser usado. Você pode simplesmente retornar domain
método para sair normalmente (código de saída 0).Em um aplicativo de inicialização de primavera, você pode usar algo assim
ShutdownManager.java
fonte
ApplicationContext
pode ser injetado automaticamente em outros grãos.Isso funciona, mesmo quando feito é impresso.
Então, adicionando
.close()
depoisrun()
Explicação:
e:
Então, basicamente, não fechará o contexto pai, é por isso que a VM não fecha.
fonte
SpringApplication.exit(appContext, () -> returnCode)
.SpringApplication.run(MyApplication.class, args)
, não há contexto pai. Há apenas um contexto, o contexto criado e retornadorun
, que você imediatamenteclose
. @Michael está certo. Isso não funcionará para programas que precisam fazer qualquer coisa depois que o contexto Spring é inicializado, que é a maioria dos programas.No aplicativo você pode usar
SpringApplication
. Isso tem umexit()
método estático que leva dois argumentos: oeApplicationContext
umExitCodeGenerator
:ou seja, você pode declarar este método:
Nos testes de integração, você pode alcançá-lo adicionando
@DirtiesContext
anotações no nível da classe:@DirtiesContext(classMode=ClassMode.AFTER_CLASS)
- O ApplicationContext associado será marcado como sujo após a aula de teste.@DirtiesContext(classMode=ClassMode.AFTER_EACH_TEST_METHOD)
- O ApplicationContext associado será marcado como sujo após cada método de teste na classe.ie
fonte
Isso garantirá que o aplicativo SpringBoot seja fechado corretamente e os recursos sejam liberados de volta para o sistema operacional,
fonte