eigene Anwendung per Servlet Container starten

freez

Top Contributor
Hallo,

gibt es eine Möglichkeit beim Start eines Servlet Containers wie Tomcat eine eigene Java Anwendung mitzustarten (Umgebung: Tomcat 7, Java 6, Spring 3, JSF 2). Die Anwendung soll einfach gewisse Arbeiten zyklisch, oder auch nur einmalig durchführen, die für die Anwendung wichtig sind (Jobs). Betriebssystemspezifische Einrichtungen möchte ich hier aussen vor lassen (cron, Scheduled Tasks, usw.), da dies integraler Bestandteil der Anwendung ist. Schön wäre natürlich auch, wenn ich Zugriff auf die SpringBeans hätte, die für die Webanwendung genutzt werden. Bzw. wäre es auch anders herum wünschenswert von den SpringBeans auf die Jobs zuzugreifen um Informationen zum Status zu erhalten.
 
Dann muss er auch im App-Context gestartet werden, ergo in der Anwendung laufen. Wie soll er sonst Zugriff auf den App-Context bekommen?
Und was heißt für dich "mitstarten"? Als eigener Prozess? Als eigener Thread? Als *bitte einsetzen*?
 
Und was heißt für dich "mitstarten"? Als eigener Prozess? Als eigener Thread? Als *bitte einsetzen*?

Wenn ich es selbst machen muss, dann als eigenständigen Thread. Meine Frage zielt auch ein wenig in die Richtung, ob es bereits vorhandene Mechanismen gibt um so eine nebenläufige Anwendung mit Tomcat zu starten.

Vielleicht zur Verdeutlichung ein paar Gedanken, mit denen ich nicht so recht glücklich bin:
Ich hatte schon den Gedanken, dass ich ein Servlet missbrauche und es automatisch starte. In der Init Methode dann einen Thread starten, der dann die gewünschten Arbeiten verrichtet. Nur ist das Problem, dass von einem Servlet mehrere Instanzen existieren könnten.

Zweiter Gedanke ist ein Singleton Spring Bean, welche auch wieder einen Thread startet .....
Allerdings werden komischerweise 2 Instanzen beim Starten vom Tomcat erzeugt. Somit fällt dies auch flach (mit static definition des Thread wollte ich in dem Fall gar nicht erst anfangen)
 
Für einmalige Jobs kann man doch die Lifecycle Listener der Servlet API nutzen, für wiederkehrende bietet sich doch (da du das sowieso schon nutzt) Spring selber an. Gibt doch eine Scheduler Komponente in Spring.
 
Welche Technik eines AppServers sollte ich deiner Meinung nach verwenden um meine Anwendung zu starten? Ich bräuchte einen Suchbegriff, damit ich damit Google füttern kann.

Prinzipiell ist dein Vorhaben so nicht sinnvoll möglich: eine Java-Applikation (wie auch immer diese aussehen mag) und ein Servlet in einem Webcontainer starten, so dass diese sich zur Laufzeit Ressourcen (konkret Spring Beans) teilen.

Die Nummer mit den eigenen Threads usw. hast du ja zum Glück schon verworfen. Alle technischen Ansätze werden auf so einen Workaround herauslaufen. Das würde ich nicht empfehlen.

So weit ich weiß könnte man auch mit Tomcat einen Scheduler laufen lassen. Ich habe mal von einer Integration von Quartz gehört. Trotdem brauchst du zumindest eine zentrale Stelle, die beide Applikationen gemeinsam initialisiert.

Die bessere Lösung ist m.E. deine Applikation so zu modularisieren, dass du daraus eine Applikation und eine Webapplikation bauen kannst.
 

Danke für den Tipp, aber der Tipp von mvitz mit den Spring Schedulern ist genau der Richtige. Schön integriert in Spring und kann per Autowire auf Beans und Services zugreifen, wie auch anders herum. Ist genau das richtige und ich muss mich nicht ums Threading kümmern.

Für eine komplett separate App, die einfach mitgestartet werden soll und nur indirekt mit der eigentlichen WebApp zu tun hat, wäre der ServletContextListener wohl der sinnvollere Weg.
 

Zurück
Oben