Ich habe einen Prozess, der eine Endlosschleife ist:Wie kann ich einen unbegrenzten Prozess im Spring Boot verwalten?
public class MyProcess {
public void start() {
while (true) {
//process
}
}
}
Wenn ich mit Spring-Boot gestartet, mein erster Ansatz war die Bohne aus dem Kontext zu erhalten, nachdem die Anwendung gestartet hatte, und den Prozess manuell starten:
@SpringBootApplication
public class MyApplication {
public static void main(String[] args) {
ApplicationContext applicationContext = SpringApplication.run(MyApplication.class, args);
MyProcess myProcess = applicationContext.getBean(MyProcess.class);
myProcess.start();
}
}
das funktionierte aber wie die richtige Art und Weise nicht, es zu tun scheinen, so implementiert ich eine CommandLineRunner
:
@Component
public class MyRunner implements CommandLineRunner {
@Autowired
private MyProcess myProcess;
@Override
public void run(String... args) {
this.myProcess.start();
}
}
Das ist fast das gleiche wie vorher, aber hier wird der SpringApplication#run
Anruf nie wirklich beendet, was auch falsch scheint. Darf ich das richtig denken?
Ich habe dann versucht, dies mit einem Executor
auf eigene Faust zu verwalten, sondern um jede Exception
zu fangen Ich hatte Future#get
zu nennen, die in der gleichen Sperrzustand geführt.
Statt dessen verwende ich jetzt eine @Async
Annotation auf der CommandLineRunner#run
Methode.
Dies scheint die beste Lösung zu sein, da die Anwendung nach dem Start der Task beendet wird. Alle Exception
werden abgeholt und protokolliert, aber die von Sprint erstellte Sicherung Executor
verhindert, dass die Anwendung heruntergefahren wird.
Ich nehme an, es gibt eine Möglichkeit, Spring zu bitten, die Executor
zu beenden, damit die gesamte Anwendung beendet werden kann, da ich sie extern mit Supervisor verwalte.
Ist dies der richtige Ansatz oder fehlt mir ein Schritt? Sollte die Anwendung unabhängig sein und den Prozess nach einem Fehler neu starten?
Dies ist, was ich zuerst gemacht habe, aber ich habe das nie in irgendwelchen Beispielen gesehen, also bin ich mir nicht sicher. Was wäre dann der Zweck von 'CommandLineRunner'? – Djon
@Djon Ich hatte dieselbe Frage. Es sieht so aus, als ob man auf Befehlszeilenargumente in einer laufenden Umgebung mit injizierten Beans zugreifen kann (nachdem die App gestartet wurde). Ich benutze '' 'CommandLineRunner''' Schnittstelle für die Kommandozeilen-App – ruX