Threading in einem Application Server
Ich habe ein Java-Programm/thread, dass ich bereitstellen möchten, in einem Application Server (GlassFish). Sollte der thread ausführen als "Dienst", der beginnt, wenn die Anwendung den Server startet und Stoppt, wenn der Anwendungs-Server schließt.
Wie würde ich gehen über das tun dies? Es ist nicht wirklich eine Session-Bean oder MDB. Es ist nur ein thread.
- Neugier: warum müssen Sie starten einen thread ? Es fühlt sich immer schlimm für mich, wenn Sie haben zu Beginn der threads in einem AppServer ...
- Der thread ist zum ausführen einer Instanz der HSQL-DB-Server
Du musst angemeldet sein, um einen Kommentar abzugeben.
Check-out die LifecycleListener Schnittstelle:
http://glassfish.java.net/nonav/docs/v3/api/index.html?com/sun/appserv/server/LifecycleListener.html
http://docs.oracle.com/cd/E18930_01/html/821-2418/beamc.html
Habe ich nur getan, dies mit Tomcat, aber es sollte funktionieren, in Glassfish.
Erstellen einer Listener-Klasse, die implementiert
javax.- servlet.ServletContextListener
, dann legen Sie es in web.xml. Sie werden informiert, wenn Ihre web-app gestartet und zerstört.Einen einfachen Listener-Klasse:
Dieser geht in web.xml nach Ihrem letzten 'context-param" und bevor Sie Ihre erste 'servlet':
Weiß nicht, ob diese Art der Sache ist, empfohlen wird oder nicht, aber es hat funktioniert gut für mich in der Vergangenheit.
web.xml
Bearbeiten der Datei zu konfigurieren Sie Ihre Zuhörer. Einfach kommentieren Sie Ihre Klasse mit@WebListener
die web-app-container automatisch zu instanzieren und registrieren der listener.Dies ist nicht etwas, das Sie tun sollten, in jeder app-server, es sei denn, Sie haben Zugriff auf die verwalteten threads von der app-server. Ich bin nicht vertraut mit Glassfish, aber man könnte dies in Websphere oder Weblogic mit einer commonj WorkManager.
Offenbar das gleiche kann erreicht werden, in Glassfish und JBOSS über einen JCA-WorkManager (die ich bin nicht vertraut mit).
Erstellen Sie ein servlet, deren init-Methode startet einen thread, das ist das Hauptprogramm.
In unserer Anwendung web.xml die Datei fügen Sie ein servlet, das umfasst eine load-on-startup-element, wo die Zahl ist die Reihenfolge, in der es beginnt.
Ich muss auch zum erstellen mehrerer threads, wobei jeder thread öffnet einen socket zu einem anderen remote-Prozesse laufen in meinem Glassfish App. Server. Ich schaute in die LifecycleListener bean zur Verfügung gestellt von Glasfischen, die Sie implementieren müssen.
Erstellte ich einen Prototypen, um führen Sie das Gewinde und Buchse Arbeit in der LifecycleListener Umsetzung und es ist wirklich nicht helfen, mit der Verwaltung dieser Ressourcen. Um Zugang zu den LifecycleListener ich musste ein public static Weise führen Sie die gewünschten Aktionen.
Sehe ich keinen Wert in LifecycleListener konnte ich da aufgeführt habe, die genau die gleiche Arbeit in meinem EJB, die der client aufrufen der LifecycleListener. Da gibt es wirklich keine ordnungsgemäße Verwaltung des Threads und Sockets in der Bohne.
Mir wurde gesagt, dass die JCA kann der beste Weg zu gehen. Ich habe nicht versucht, diese.
Starte ich eine zeitgesteuerte Objekt mit den timer-Dienst und nur einem einzigen Ablauf. Dann, im timeout, ich Tue, was ich tun wollte mit dem thread.
http://onjava.com/pub/a/onjava/2004/10/13/j2ee-timers.html
Bei mir funktionierte es, seit es nutzt die J2EE-Komponenten und ist ein anderer thread.