Ich habe eine Spring-Boot-Anwendung.So verhindern Sie, dass der Spring App-Kontext heruntergefahren wird, bis der Shutdown-Haken ausgelöst wird
Ich habe SmartLifecycle
Schnittstelle in meinem Bean implementiert, die Asynchron-snmp-Server startet in es start
Methode ist und hält es in es stop
Methode ist.
Alles funktioniert gut, außer dass der Hauptanwendungskontext direkt nach dem Start aufhört, so dass meine Server-Bean auch gleich nach dem Start anhält.
Alles, was ich brauche, ist Federkontext zu machen, um nur zu stoppen, wenn der Shutdown-Haken ausgelöst wird.
Dies ist keine Webanwendung, also brauche ich nicht spring-boot-starter-web
, die dieses Problem löst, indem Sie den Webserver starten, der den Kontext stoppt, bis der Webserver stoppt.
Ich kann etwas wie CountDownLatch
verwenden und darauf warten, dass es in meiner main
Methode gleich Null ist, nachdem Kontext beginnt. Somethig wie folgt aus:
public static void main(String[] args) throws InterruptedException {
ConfigurableApplicationContext ctx = SpringApplication.run(SnmpTrapRetranslatorApplication.class, args);
CountDownLatch snmpServerCloseLatch = ctx.getBean("snmpServerCloseLatch", CountDownLatch.class);
snmpServerCloseLatch.await();
}
Und mein Server Bean start
Methode wird diese Verriegelung erstellen mit Zählung 1
, während stop
Methode snmpServerCloseLatch.countDown()
nennen.
Diese Technik wird beschrieben here.
Aber was falsch daran ist, dass meine main
-Methode ist verantwortlich für warten meine benutzerdefinierte Server-Bean zu stoppen. Ich fühle das einfach nicht richtig.
Wie zum Beispiel spring-boot-starter-web
dies tun? Wenn es tomcat startet, wird es weiter ausgeführt, bis der Shutdown-Hook empfangen wird und er keinen Verwaltungscode in der main
-Methode haben muss. Es stoppt nur, wenn der Kontext ein Shutdown-Signal empfängt. Das gleiche Verhalten ist zum Beispiel, wenn ich @Scheduled
Methode in meiner Bean habe. Spring stoppt den Kontext auch nicht automatisch. Nur auf CTRL-C
.
Ich möchte ähnliche Wirkung erzielen. Meine main
Methode sollte nur eine Zeile haben: Starten Sie den Kontext. Der Kontext sollte meinen asynchronen Server beim Starten oder Stoppen starten und stoppen (bereits erreicht durch SmartLifecycle
) und sollte nicht aufhören, bis das Herunterfahren angefordert wird (CTRL-C, SIGINT usw.).