2010-12-02 2 views
2

Wir müssen einen Housekeeping-Thread in einem EJB3.0-Container ausführen. Wir haben derzeit ein "TimerService" @Stateless EJB (notwendig, weil es andere @ EJBs injiziert hat), die einen Intervall-EJB-Timer erzeugen, wenn die startTimer() -Methode aufgerufen wird. Es sollte nur eine Instanz dieses Timer-Threads geben. Die aktuelle Lösung beinhaltet den Aufruf von startTimer() von der init() -Methode eines unserer Servlets, wobei das Servlet beim Start in der web.xml geladen werden muss, aber das fühlt sich an wie ein zufälliges Verhalten anstelle der richtigen Vorgehensweise . Wir hatten bereits ein Problem, weil jemand anderes das Servlet unterklassifiziert hat, was bedeutete, dass init() zweimal aufgerufen wurde, was zwei Timer-Threads bedeutete.Einzelner Hintergrund-Thread in einem EJB3.0-Container

Dies fühlt sich an, als ob es keine ungewöhnliche Anforderung ist, also, was ist der richtige Weg, dies zu tun, wenn überhaupt? Es scheint mir so, als müsste es einen einfachen Weg geben, den Container zu bitten, beim Start einen Thread zu starten, ohne ihn an andere Ressourcen im Container binden zu müssen.

+0

vielleicht verwandt? http://stackoverflow.com/questions/2707733/eager-auto-loading-of-ejb-load-ejb-on-startup-on-jboss – Bozho

+0

Danke - die angenommene Antwort gilt für EJB3.1, die wir nicht sind Verwenden, aber von Interesse ist die andere Antwort, die erwähnt, dass der beste Weg vor 3.1 ist die Lösung, die wir derzeit verwenden :( – RevBingo

Antwort

0

Unterstützt Ihr App-Server "Startup Beans"? Ich frage, weil es in WebSphere Application Server eine Option in der Administrationskonsole gibt, um den Server so einzustellen, dass beim Start des Servers "Startup-Beans" ausgelöst werden. Wir verwenden es für bestimmte Anwendungen, die viel "schweres Laden" und Initialisierung erfordern, so dass wir die Anlaufzeit für die Endbenutzererfahrung minimieren können. Hier ist ein Link zu WAS 6 Documentation (alt, ich weiß, aber immer noch hilfreich). Startup beans

Ich weiß, dass dies spezifisch für IBM WebSphere ist, aber vielleicht hat Ihr App-Server (wenn nicht WebSphere) etwas Ähnliches, um Ihnen zu helfen, sie abzuschlagen?

+0

Wir verwenden JBoss 5.1.0. Eine schnelle Google hat keine ähnliche Funktionalität enthüllt. – RevBingo

0

Ich möchte 2 Lösungen vorschlagen.

1 Die Lösung für Ihre Implementierung. machen Sie Ihr Servlet endgültig. Dies wird Unterklassen vermeiden. Aber das Servlet kann immer noch zweimal bereitgestellt werden. Um dies zu vermeiden, erstellen Sie eine statische boolesche Variable im Servlet. Das init sollte diese Variable überprüfen. Wenn es falsch ist, wird es wahr und geht weiter. Andernfalls wird eine Ausnahme ausgelöst.

Dies ist eine schnelle Lösung, die Sie jetzt tun können. aber es ist keine "richtige" Lösung. Dies funktioniert beispielsweise nicht in einer Clusterumgebung.

2 Es gibt 2 "richtige" Lösungen.

2.1. Verwenden Sie Quarz

2.2. Implementieren Sie den Timer mit JCA. Connector ist der einzige Ort in J2EE, an dem Sie legal Threads und Timer verwenden können.

Ich erwähne JCA in anderem Zusammenhang in diesem Artikel: http://alexradzin.blogspot.com/2010/10/send-delayed-jms-messages.html Sie sind willkommen, um es anzuzeigen und ein kurzes Codebeispiel zu sehen, dass Ihnen wahrscheinlich helfen kann.

1

Für EJB < 3.1 müssen Sie Application Server spezifisch oder hackish bekommen. Da Sie erwähnen, dass Sie JBoss verwenden, können Sie das @Management-Tag verwenden, das Lebenszyklusmethoden definiert hat.