Spring Boot - Beste start in einen hintergrund-thread auf Bereitstellung
Ich habe eine Spring-Boot-Anwendung bereitgestellt, die in Tomcat-8. Wenn die Anwendung startet, möchte ich erst ein worker-Thread im hintergrund, der Frühling Autowires mit ein paar Abhängigkeiten. Derzeit habe ich dieses :
@SpringBootApplication
@EnableAutoConfiguration
@ComponentScan
public class MyServer extends SpringBootServletInitializer {
public static void main(String[] args) {
log.info("Starting application");
ApplicationContext ctx = SpringApplication.run(MyServer.class, args);
Thread subscriber = new Thread(ctx.getBean(EventSubscriber.class));
log.info("Starting Subscriber Thread");
subscriber.start();
}
In meinem Andockfenster test environment das funktioniert gut - aber wenn ich Sie stellen diese auf meinem Linux (Debian Jessie, Java 8), die Gastgeber in Tomcat 8, die ich nie finden Sie in der "Start-Abonnenten Thread" Nachricht (und den thread nicht gestartet).
- So kann es laufen als standalone-server auch ohne Tomcat.
- und was ist, ruft diese
main
imtomcat
Umfeld? - Mit einer Methode annotiert @Bean in MyServer Klasse?
- Sie sind sich der Tatsache bewusst, dass ein thread in einer EE Umgebung ist grundsätzlich eine schlechte Sache zu tun? Erstellen Sie einfach ein service im Frühjahr mit Anmerkungen versehen Sie es mit
@Scheduled
und laufen lassen, auf bestimmte Intervalle. Oder noch besser, warum brauchst du diesen thread? In der Regel gibt es bessere (und mehr Frühling integrierten) Lösungen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Der main-Methode wird nicht aufgerufen, wenn die Bereitstellung der Anwendung auf eine nicht-eingebettete application server.
Der einfachste Weg starten, um ein thread zu finden, ist aus den Bohnen Konstruktor.
Auch eine gute Idee, um aufzuräumen den thread, wenn der Rahmen geschlossen ist, zum Beispiel:
@Component
statt, obwohl Sie sich anmelden können, die Bohne, aber Sie wollen, wirklich.@PostConstruct
annotation.Hätte man eine Bohne, welche impelements
ApplicationListener<ContextRefreshedEvent>
EsonApplicationEvent
aufgerufen werden, starten Sie einfach Ihren thread gibt, falls nicht bereits begonnen. Ich denke, Sie wollen die ApplicationReadyEvent durch die Art und Weise.Bearbeiten
Wie fügen Sie einen Haken an die Anwendung Kontext-Initialisierung Veranstaltung?