2017-07-13 3 views
0

Ich entwickle eine Spring Boot App, in der ich Java-Code schreiben muss, um die App selbst (einschließlich der Threads) herunterzufahren und dann neu zu starten. Ich habe die folgenden zwei Methoden versucht, ist die erste Linux-Befehl in Java wie folgt auszustellen:Spring Boot Programmgesteuert neu starten App

ist
Process p = Runtime.getRuntime().exec("kill -SIGINT " + pid); 

wo pid, dass sich der App. Dies hat den gleichen Effekt wie das Drücken von "ctrl + c". Aber nachdem ich die App erfolgreich heruntergefahren habe, weiß ich nicht, wie ich es neu starten kann. Ich habe versucht, einen anderen Befehl (wie "mvn spring-boot:run", wie ich die App starte) mit der gleichen Methode, aber da die App bereits heruntergefahren ist, funktioniert das nicht.

Zweitens, ich habe auch versucht, die refresh() Methode der AbstractApplicationContext Aufruf wie folgt:

AbstractApplicationContext appContext = new AnnotationConfigApplicationContext(); 
appContext.registerShutdownHook(); 
appContext.refresh(); 

Aber ich glaube nicht, diese Art von Kontext erfrischend ist das gleiche wie ein Neustart?

Was ist der richtige Weg, um eine Spring Boot App mit Java-Code neu zu starten? Jede Hilfe wird geschätzt, danke!

+0

Ich glaube nicht, dass es eine richtige Art und Weise ist Frühling Boot-Anwendung mit Java neu zu starten Code. Warum nicht Shell-Skript stattdessen? Auch serverseitige Anwendungen sollten so konzipiert sein, dass sie lange laufen können. –

Antwort

0

Anstatt nur den Befehl kill auszuführen, führen Sie ein bereits vorbereitetes Skript/Programm aus, das den aufrufenden Prozess beendet und eine neue Instanz der Anwendung startet.

0

DevTools setzt den Shutdown-Hook des Anwendungskontexts zum Schließen während eines Neustarts voraus. Es wird nicht korrekt funktionieren, wenn Sie den Shutdown-Hook über SpringApplication.setRegisterShutdownHook(false) deaktiviert haben.

Siehe auch: Using Spring Boot.

1

Sie müssen spring-boot-starter-actuator und Spring cloud Abhängigkeiten zu Ihrer Anwendung hinzufügen und /restart Endpunkt verwenden, um die App neu zu starten. Here ist die Dokumentation:

für eine Feder-Boot-Actuator-Anwendung gibt es einige zusätzliche Management-Endpunkte sind:

  • POST/env die Umwelt zu aktualisieren und @ConfigurationProperties rebind log Stufen

  • /Refresh zum erneuten Laden des Bootstrap-Kontexts und Aktualisieren der @RefreshScope-Beans

  • /Neustart für die Application schließen und (standardmäßig deaktiviert)

  • /Pause und/resume für den Aufruf der Lifecycle-Methoden (stop() und start() auf dem Application)

  • Neustart

Sobald Sie fertig sind, können Sie einen REST API Aufruf verwenden, um die Anwendung neu zu starten (über RestTemplate oder curl). Dies wird eine sauberere Möglichkeit sein, die App neu zu starten, als sie zu beenden und erneut auszuführen.

+0

Danke. Können Sie näher erläutern, wie RestTemplate verwendet wird, um eine gültige POST-Anfrage an/Neustart zu senden? Ich habe versucht, postForObject ("/ restart", null, String.class) -Methode mit RestTemplate zu verwenden, bekam aber eine Ausnahme "java.lang.IllegalArgumentException: URI ist nicht absolut". Ich bin neu bei Spring Boot. Vielen Dank. – fittaoee

0

Zusatz Darshan Mehta Antwort:

In meinem Fall habe ich dies tat:

1.added dependecies:

compile("org.springframework.boot:spring-boot-starter-actuator") 
compile("org.springframework.cloud:spring-cloud-starter:1.2.4.RELEASE") 

2.autowired restartEndpoint:

import org.springframework.cloud.context.restart.RestartEndpoint; 
.... 
@Autowired 
private RestartEndpoint restartEndpoint; 

3. und ruft:

Thread thread = new Thread(new Runnable() { 
    @Override 
    public void run() { 
     restartEndpoint.invoke(); 
    } 
}); 
thread.setDaemon(false); 
thread.start(); 

ich neues Thema brauche, weil Frühling mvc für jede Anforderung Daemon-Threads erstellt

Verwandte Themen