Wie man einen Prozess im hintergrund in Java EE
Möchte ich einen Hintergrundprozess starten im Java-EE - (OC4J 10) Umwelt. Es scheint falsch zu starte einfach einen Thread mit "neuer Thread" Aber ich kann nicht finden, eine gute Möglichkeit für diese.
Verwendung einer JMS-queue ist schwierig, in meinem speziellen Fall, da mir die Parameter für diese Methode nennen, sind nicht serialisierbar.
Ich dachte auch über die Verwendung eines onTimeout
Timer-Methode einer session bean, aber diese nicht erlauben, mich zum übergeben von Parametern (soweit ich weiß).
Gibt es keine "canon" Weg zu behandeln, eine Aufgabe, oder muss ich nur noch wieder auf "new Thread" oder ein java.concurrent.ThreadPool
.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Java EE in der Regel versucht, zu entfernen threading von den Entwicklern sorgen. (Es ist Erfolg dies ist ein ganz anderes Thema).
JMS ist eindeutig die bevorzugte Methode, dies zu behandeln.
Mit den meisten Parametern haben Sie die Möglichkeit, zu erzwingen oder vorspielen, Serialisierung, auch wenn Sie nicht standardmäßig serialisierbar. Abhängig von den Daten, wrappen es in einem serialisierbaren Objekt, das die Daten neu laden. Dies wird deutlich davon abhängen, parameter und Anwendung.
JMS ist die Java-EE-Weg, dies zu tun. Sie können Ihre eigenen threads, wenn die container können Sie, aber nicht gegen die Java EE-Spezifikation (Sie können oder können möglicherweise nicht sich dafür interessieren).
Wenn Sie nicht über die Java-EE-generic-Konformität (wenn Sie würde in der Tat resort threads, anstatt sich mit JMS), die Oracle-container, wird für Sie sicher haben eigene Möglichkeiten, dies zu tun (wie die OracleAS Job-Scheduler).
Weiß nicht, OCJ4 im detail, aber ich habe den Thread-Konzepts und java.util.Timer-Ansatz zur Durchführung Ihrer Aufgaben in einer Tomcat-basierten Anwendung. In Java 5+ gibt es eine option, um die Verwendung eines Testamentsvollstreckers services (Mankind, Priorität).
Ich weiß nicht, über die onTimeout aber könnte man Parameter übergeben, um in der Sitzung selbst, die app-Kontext oder in einer statischen Variablen (entmutigt würden einige sagen). Aber der name sagt mir, es wird aufgerufen, wenn der Benutzer die Sitzung mal aus und Sie wollen etwas Aufräumen.
Mittels JMS ist der richtige Weg, es zu tun, aber es ist schwerer Gewicht.
Den Vorteil, den Sie bekommen, ist, dass, wenn Sie benötigen mehrere Server, ein server oder was auch immer, sobald die Server konfiguriert sind, Ihre "Einfädeln" kann nun verteilt werden auf mehrere Maschinen.
Es bedeutet auch, Sie nicht wollen, um eine Nachricht zu senden, die für eine wahrhaft triviale Menge an Arbeit oder mit eine riesige Menge von Daten. Wählen Sie Ihre Schnittstelle Punkte gut.
hier finden Sie einige weitere Infos:
stackoverflow.com/questions/533783/why-spawning-threads-in-j2ee-container-is-discouraged
Ich habe erstellen von threads in einem container (Tomcat, JBoss) mit kein problem, aber Sie waren wirklich einfache Warteschlangen, und ich glaube nicht verlassen sich auf clustering.
Jedoch, EJB 3.1 einführen, die den asynchronen Aufruf, die Sie nützlich finden können:
http://www.theserverside.com/tt/articles/article.tss?track=NL-461&ad=700869&l=EJB3-1Maturity&asrc=EM_NLN_6665442&uid=2882457
Java EE nicht wirklich verbieten, die Sie zum erstellen Ihrer eigenen threads, es ist der EJB-Spezifikation, die sagt, "nicht verwalteten threads" arn nicht erlaubt. Der Grund dafür ist, dass diese threads bekannt sind, die application server und damit der container nicht verwalten Dinge wie Sicherheit und Transaktionen auf diese threads.
Dennoch gibt es viele frameworks gibt, die Ihre eigenen threads erstellen. Zum Beispiel Quarz, Achse und Feder. Änderungen sind Ihr schon mit einem von diesen, so dass es nicht schlecht ist, zu erstellen Sie Ihre eigenen threads so lange, wie Sie wissen, die Folgen. Das sagte ich den anderen auch Zustimmen, dass die Verwendung von JMS oder JCA ist bevorzugt über die manuelle thread-Erstellung.
Durch die Art und Weise, OC4J ermöglicht Ihnen das erstellen Sie Ihre eigenen threads. Allerdings ist es nicht erlaubt, die JNDI-lookups von diesen nicht verwalteten threads. Sie können deaktivieren Sie diese Einschränkung durch die Angabe der -userThreads argument.
Ich komme aus einer .NET hintergrund, und JMS scheint ziemlich schwer-Gewicht auf mich. Stattdessen empfehle ich Quarz, was ist ein hintergrund-scheduling-Bibliothek für Java-und JEE-apps. (Ich habe Quartz.NET in meinem ASP.NET MVC-app mit viel Erfolg.)