Ich lerne gerade Java EE (aus SE) und bin über die asynchrone Ausführung in der Java EE Umgebung verwirrt.
Grundsätzlich ist das, was ich verstehe, Thread
oder Timer
zu erstellen, nicht genau zu empfehlen. Eine andere Methode, die ich bis jetzt gefunden habe, benutze JMS für die Übertragung der Nachricht an EJB Message Bean und es wird asynchron ausgeführt.
Was sind andere Methoden, um dieses Verhalten zu erreichen? Die Verwendung von JMS sieht für einfache Aufgaben wie zu viel Aufwand aus.
Die einfachste mögliche Lösung in Java EE 6 ist @Asynchronous
Anmerkung zu Ihrer EJB-Methode (oder der gesamten Klasse). Sie können eine Geschäftsmethode asynchron aufrufen, was bedeutet, dass ein neuer Thread zur Ausführung dieser Methode delegiert wird und Sie das Steuerelement in der Aufrufmethode zurückbekommen.
In Pre-Java EE 6 Tagen wurde das JMS für diesen Zweck verwendet.
Als Randnotiz - in Servlets Sie können auch asynchrone Ausführung verwenden.
Sie können den feder task executor verwenden .
Andere Jobs fügen es möglicherweise in eine Datenbank ein und führen eine Aufgabe aus, die die Datenbank abfragt.
Bei großen Anwendungen können Sie sogar einen Enterprise Service Bus in Erwägung ziehen.
Alles hängt davon ab, wie wichtig diese Aufgaben sind und welche Anstrengungen Sie unternehmen möchten.
Für nicht so wichtige Aufgaben werden oft einfache Threads ausreichen.
Grundsätzlich wird asynchrones Verhalten mit Threads erreicht, da kommt man nicht herum.
In einer Java EE-Umgebung wird es jedoch als eine schlechte Vorgehensweise angesehen, Threads selbst zu öffnen. Höchstwahrscheinlich wirst du die Einrichtung deines Servers nutzen wollen, die dir eine (richtig) verwaltete Umgebung für Async-Sachen bietet.
JMS ist eine Möglichkeit asynchrone Tasks auszuführen, ich würde das für Task-Streams empfehlen, die kontinuierlich verarbeitet werden müssen. Die meisten Java-Anwendungsserver verfügen über Planungsmanager, mit denen Sie einzelne Aufgaben in der Zukunft planen können (z. B. über Quarz). Einige Frameworks unterstützen auch die Java EE 6-Annotationen für @javax.ejb.Asynchronous
.
Und ja, wenn du musst, kannst du immer nur ein einziges Thread
spawnen und alles vergessen. Stell nur sicher, dass du weißt, was du tust.
Es läuft alles darauf hinaus, was genau Ihr Anwendungsfall ist und welche Methoden Ihre Umgebung unterstützt. Es gibt keine einzige richtige Antwort.
Die Java EE 6 und Spring Enthusiasten haben gesprochen; irgendwie haben alle% javax.ejb.TimerService
von Java EE 5 weggelassen, was, ich rate mal, ist derzeit [ab 2011] die vorherrschende Plattform.
Sie injizieren das TimerService
in Ihre zustandslose oder nachrichtengesteuerte Bean und verwenden eine seiner createTimer(...)
-Methoden, um die asynchrone Ausführung zu planen. Dann implementieren Sie die Timeout-Logik in einer annotierten Methode:
Und das ist es. Die Verwendung von JMS nur wegen seiner asynchronen Natur war nie eine gute Option, außer vor so langer Zeit wie in J2EE.
Tags und Links java java-ee asynchronous jms ejb