# eigene Anwendung per Servlet Container starten



## freez (17. Jul 2012)

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.


----------



## Noctarius (17. Jul 2012)

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*?


----------



## FArt (17. Jul 2012)

Du solltest deine Anwendungen modularisieren und einen Applicationserver verwenden.


----------



## freez (17. Jul 2012)

Noctarius hat gesagt.:


> 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)


----------



## freez (17. Jul 2012)

FArt hat gesagt.:


> Du solltest deine Anwendungen modularisieren und einen Applicationserver verwenden.



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.


----------



## mvitz (17. Jul 2012)

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.


----------



## freez (17. Jul 2012)

mvitz hat gesagt.:


> Gibt doch eine Scheduler Komponente in Spring.



Danke für den Tipp, ich schaue es mir an. Klingt vielversprechend.


----------



## FArt (17. Jul 2012)

freez hat gesagt.:


> 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.


----------



## JimPanse (18. Jul 2012)

ServletContextListener



> void contextInitialized(ServletContextEvent sce)
> Notification that the web application initialization process is starting.


----------



## freez (21. Jul 2012)

JimPanse hat gesagt.:


> ServletContextListener



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.


----------

