Eines der ersten Dinge, die ich über die Java EE-Entwicklung gelernt habe, ist, dass ich keine eigenen Threads in einem Java EE-Container erzeugen sollte. Aber wenn ich darüber nachdenke, kenne ich den Grund nicht.
Können Sie klar erklären, warum davon abgeraten wird?
Ich bin sicher, dass die meisten Unternehmensanwendungen asynchrone Jobs wie Mail-Daemons, Leerlaufsitzungen, Bereinigungsjobs usw. benötigen.
Also, wenn man in der Tat keine Threads erzeugen sollte, wie kann man das bei Bedarf richtig machen?
java
multithreading
jakarta-ee
LiorH
quelle
quelle
Antworten:
Es wird davon abgeraten, da alle Ressourcen in der Umgebung vom Server verwaltet und möglicherweise überwacht werden sollen. Außerdem wird ein Großteil des Kontexts, in dem ein Thread verwendet wird, normalerweise an den Ausführungsthread selbst angehängt. Wenn Sie einfach einen eigenen Thread starten (was meiner Meinung nach einige Server nicht einmal zulassen), kann er nicht auf andere Ressourcen zugreifen. Dies bedeutet, dass Sie keinen InitialContext abrufen und keine JNDI-Lookups durchführen können, um auf andere Systemressourcen wie JMS-Verbindungsfactorys und Datenquellen zuzugreifen.
Es gibt Möglichkeiten, dies "richtig" zu machen, dies hängt jedoch von der verwendeten Plattform ab.
Der commonj WorkManager ist für WebSphere und WebLogic sowie andere üblich
Mehr Infos hier
Und hier
Auch etwas dupliziert dieses von heute Morgen
UPDATE: Bitte beachten Sie, dass sich diese Frage und Antwort auf den Zustand von Java EE im Jahr 2009 bezieht. Seitdem haben sich die Dinge verbessert!
quelle
Für EJBs wird nicht nur davon abgeraten, es ist ausdrücklich durch die Spezifikation verboten :
und
Der Grund dafür ist, dass EJBs in einer verteilten Umgebung betrieben werden sollen. Ein EJB kann von einem Computer in einem Cluster auf einen anderen verschoben werden. Gewinde (und Steckdosen und andere eingeschränkte Einrichtungen) sind ein erhebliches Hindernis für diese Portabilität.
quelle
Der Grund, warum Sie keine eigenen Threads erzeugen sollten, ist, dass diese nicht vom Container verwaltet werden. Der Container kümmert sich um viele Dinge, die sich ein unerfahrener Entwickler nur schwer vorstellen kann. Beispielsweise werden Dinge wie Thread-Pooling, Clustering und Absturzwiederherstellungen vom Container ausgeführt. Wenn Sie einen Thread starten, können Sie einige davon verlieren. Mit dem Container können Sie auch Ihre Anwendung neu starten, ohne die JVM zu beeinflussen, auf der sie ausgeführt wird. Wie wäre dies möglich, wenn Threads außerhalb der Kontrolle des Containers liegen?
Dies ist der Grund, warum ab J2EE 1.4 Timer-Dienste eingeführt wurden. Weitere Informationen finden Sie in diesem Artikel.
quelle
Parallelitätsdienstprogramme für Java EE
Es gibt jetzt eine standardmäßige und korrekte Methode zum Erstellen von Threads mit der Java EE-Kern-API:
Durch die Verwendung von Concurrency Utils stellen Sie sicher, dass Ihr neuer Thread erstellt und vom Container verwaltet wird, und stellen sicher, dass alle EE-Dienste verfügbar sind.
Beispiele hier
quelle
Sie können den Container jederzeit anweisen, Dinge als Teil Ihrer Bereitstellungsdeskriptoren zu starten. Diese können dann alle Wartungsaufgaben ausführen, die Sie ausführen müssen.
Beachte die Regeln. Du wirst eines Tages froh sein, dass du es getan hast :)
quelle
Threads sind in Java EE-Containern gemäß den Blaupausen verboten. Weitere Informationen finden Sie in den Bauplänen .
quelle
Es gibt keinen wirklichen Grund, dies nicht zu tun. Ich habe Quarz mit Spring ohne Probleme in einer Webanwendung verwendet. Es kann auch das Parallelitäts-Framework
java.util.concurrent
verwendet werden. Wenn Sie Ihre eigene Thread-Behandlung implementieren, setzen Sie die Theads auf deamon oder verwenden Sie eine eigene deamon-Thread-Gruppe, damit der Container Ihre Webanwendung jederzeit entladen kann.Aber seien Sie vorsichtig, die Bean Scopes- Sitzung und -Anforderung funktionieren nicht in gespawnten Threads! Auch anderer Code, auf den gebündelt wird,
ThreadLocal
funktioniert nicht sofort. Sie müssen die Werte selbst auf die erzeugten Threads übertragen.quelle
Ich habe nie gelesen, dass es entmutigt ist, außer der Tatsache, dass es nicht einfach ist, es richtig zu machen.
Es ist eine ziemlich einfache Programmierung, und wie bei anderen Techniken auf niedriger Ebene sollten Sie einen guten Grund haben. Die meisten Parallelitätsprobleme können mithilfe integrierter Konstrukte wie Thread-Pools weitaus effektiver gelöst werden.
quelle
Ein Grund, den ich gefunden habe, wenn Sie einige Threads in Ihrem EJB erzeugen und dann versuchen, den Container zu entladen oder Ihren EJB zu aktualisieren, werden Sie auf Probleme stoßen. Es gibt fast immer eine andere Möglichkeit, etwas zu tun, bei dem Sie keinen Thread benötigen. Sagen Sie einfach NEIN.
quelle