2016-08-02 15 views
1

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?

Antwort

0

Tun Sie etwas Arbeit im Hauptthread. Was ist los mit dem Anruf myProcess.start() von main() ohne @Async? Wenn du deinen Job beendest, lass einfach die Schleife los MyProcess#start

+0

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

+0

@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

Verwandte Themen