Comment puis-je arrêter par programme une application Spring Boot sans arrêter la machine virtuelle ?
Dans d'autres œuvres, quel est le contraire de
new SpringApplication(Main.class).run(args);
java
spring
spring-boot
Axel Fontaine
la source
la source
Réponses:
Fermer un
SpringApplication
signifie essentiellement fermer le sous-jacentApplicationContext
. LaSpringApplication#run(String...)
méthode vous donne celaApplicationContext
sous forme de fichierConfigurableApplicationContext
. Vous pouvez ensuite leclose()
faire vous-même.Par exemple,
Vous pouvez également utiliser la
static
SpringApplication.exit(ApplicationContext, ExitCodeGenerator...)
méthode d'assistance pour le faire pour vous. Par exemple,la source
ExitCodeGenerator
peut être utilisé. Vous pouvez simplement revenir de lamain
méthode pour quitter gracieusement (code de sortie 0).Dans une application de démarrage au printemps, vous pouvez utiliser quelque chose comme ça
ShutdownManager.java
la source
ApplicationContext
peut être automatiquement injecté dans d'autres beans.Cela fonctionne, même fait est imprimé.
Donc en ajoutant
.close()
aprèsrun()
Explication:
et:
Donc, fondamentalement, cela ne fermera pas le contexte parent, c'est pourquoi la VM ne se ferme pas.
la source
SpringApplication.exit(appContext, () -> returnCode)
.SpringApplication.run(MyApplication.class, args)
, il n'y a pas de contexte parent. Il n'y a qu'un seul contexte, le contexte créé et renvoyé parrun
, que vous ensuite immédiatementclose
. @Michael a raison. Cela ne fonctionnera pas pour les programmes qui ont besoin de faire quoi que ce soit après l'initialisation du contexte Spring, qui est la plupart des programmes.Dans l'application, vous pouvez utiliser
SpringApplication
. Cela a uneexit()
méthode statique qui prend deux arguments: leApplicationContext
et unExitCodeGenerator
:c'est à dire que vous pouvez déclarer cette méthode:
Dans les tests d'intégration, vous pouvez y parvenir en ajoutant une
@DirtiesContext
annotation au niveau de la classe:@DirtiesContext(classMode=ClassMode.AFTER_CLASS)
- Le ApplicationContext associé sera marqué comme sale après la classe de test.@DirtiesContext(classMode=ClassMode.AFTER_EACH_TEST_METHOD)
- Le ApplicationContext associé sera marqué comme sale après chaque méthode de test de la classe.c'est à dire
la source
Cela garantira que l'application SpringBoot est fermée correctement et que les ressources sont libérées vers le système d'exploitation,
la source