Wie kann ich eine Spring Boot- Anwendung programmgesteuert herunterfahren, ohne die VM zu beenden ?
In anderen Werken, was ist das Gegenteil von
new SpringApplication(Main.class).run(args);
java
spring
spring-boot
Axel Fontaine
quelle
quelle
Antworten:
Das Schließen von a
SpringApplication
bedeutet im Grunde das Schließen des BasiswertsApplicationContext
. DieSpringApplication#run(String...)
Methode gibt Ihnen dasApplicationContext
alsConfigurableApplicationContext
. Sie können es dannclose()
selbst tun.Beispielsweise,
Alternativ können Sie die
static
SpringApplication.exit(ApplicationContext, ExitCodeGenerator...)
Hilfsmethode verwenden, um dies für Sie zu tun. Beispielsweise,quelle
ExitCodeGenerator
verwendet werden kann. Sie können einfach von dermain
Methode zurückkehren, um ordnungsgemäß zu beenden (Beendigungscode 0).In einer Spring Boot-Anwendung können Sie so etwas verwenden
ShutdownManager.java
quelle
ApplicationContext
automatisch in andere Bohnen injiziert werden kann.Dies funktioniert, auch wenn es gedruckt wird.
Also
.close()
nachher hinzufügenrun()
Erläuterung:
und:
Im Grunde genommen wird der übergeordnete Kontext nicht geschlossen. Deshalb wird die VM nicht beendet.
quelle
SpringApplication.exit(appContext, () -> returnCode)
.SpringApplication.run(MyApplication.class, args)
, gibt es keinen übergeordneten Kontext. Es gibt nur einen Kontext, den Kontextrun
, der von Ihnen erstellt und zurückgegeben wird , den Sie dann sofortclose
. @ Michael ist richtig. Dies funktioniert nicht für Programme, die nach der Initialisierung des Spring-Kontexts etwas tun müssen. Dies sind die meisten Programme.In der Anwendung können Sie verwenden
SpringApplication
. Dies hat eine statischeexit()
Methode, die zwei Argumente akzeptiert: dasApplicationContext
und einExitCodeGenerator
:dh Sie können diese Methode deklarieren:
Innerhalb der Integrationstests können Sie dies erreichen, indem Sie
@DirtiesContext
Anmerkungen auf Klassenebene hinzufügen :@DirtiesContext(classMode=ClassMode.AFTER_CLASS)
- Der zugehörige ApplicationContext wird nach der Testklasse als fehlerhaft markiert.@DirtiesContext(classMode=ClassMode.AFTER_EACH_TEST_METHOD)
- Der zugehörige ApplicationContext wird nach jeder Testmethode in der Klasse als fehlerhaft markiert.dh
quelle
Dadurch wird sichergestellt, dass die SpringBoot-Anwendung ordnungsgemäß geschlossen und die Ressourcen wieder für das Betriebssystem freigegeben werden.
quelle