Frage

Ich schreibe eine Java EE-Anwendung mit Struts und Spring.Bei einem der Vorgänge kommt es zu einer starken Datenbankverarbeitung und damit zu Leistungsproblemen.Ich möchte wissen, ob ich hier Multithreading verwenden kann.Ich denke, die Java EE-Spezifikation erlaubt nicht die Erstellung benutzerdefinierter Threads, abgesehen von denen, die vom Server erstellt wurden (ich verwende Weblogic).Bitte leiten Sie mich dabei.

War es hilfreich?

Lösung

Diese Frage taucht hin und wieder auf.

Gemäß der Spezifikation ist es nicht autorisiert.Die beste Seite, die man sich ansehen sollte, ist diese: F/A:J2EE-Einschränkungen

Allerdings gibt es Möglichkeiten, Threads zu erzeugen, insbesondere in Weblogic mit dem WorkManager.

Sehen Sie sich diese Fragen an:

Die Tatsache, dass der erste auf EJB abzielt, sollte keine so große Rolle spielen, und der letzte, der sich mit dem Zugriff auf das Dateisystem befasst, befasst sich mit allgemeinen Einschränkungen.

Ich hoffe es hilft.

Andere Tipps

Die empfohlene Art, Fäden in einer Java-EE-Umgebung zu erstellen, ist mit der Parallelität at API, die Teil der EE7-Spezifikation ist.

Durch die Verwendung dieser API wird Ihr neuer Thread erstellt und vom Container verwaltet und garantiert, dass alle EE-Dienste Ihrem Thread verfügbar sind (z. B. Sicherheit, Transaktionen).

Die nachstehenden Beispiele werden von meiner eigenen Site aufgenommen hier und hier

mit einem managextexecutorservice

Zum Erstellen eines neuen Threads mithilfe eines ManagedExecutorService erstellen Sie zunächst ein Aufgabenobjekt, das aufrufbar setzt. Innerhalb der Call () -Methode definieren wir die Arbeit, die wir in einem separaten Thread ausführen möchten.

generasacodicetagpre.

Dann müssen wir die Aufgabe aufrufen, indem wir ihn an die Submit-Methode des ManagedExecutorServiceService weitergeben.

generasacodicetagpre.

mit einem ManagedThreadFactory

Erstellen Sie zuerst eine durchlaufbare Aufgabe, die definiert wird, welche Arbeit im Hintergrund erfolgen soll.

generasacodicetagpre.

Um einen Container-Managed-Thread zu erhalten, fragen wir einfach den ManagedThreadFactory für ein neues Thread und übergeben sie unsere ausgeführbare Instanz. Um den Thread zu starten, rufen wir den Start () an.

generasacodicetagpre.

Diese Einschränkungen sind meistens vorhanden, da Java EE und EJB transparentes Clustering unterstützen möchten.Beispielsweise sollte ein Server eines Clusters keine Dateien ändern, da diese Änderungen nicht leicht auf andere Server gespiegelt werden können.Für Threads gibt es die Frage, ob ein Thread pro Cluster oder pro Server vorhanden sein sollte.Diese Threads können auch vom Anwendungsserver nicht einfach überwacht werden.

Das heißt, es sollte möglich sein, Threads, Socket-Verbindungen zu erstellen oder auf das Dateisystem in einem Java EE-Server wie in einer normalen Anwendung zuzugreifen.

Wenn Sie hier mehrere Threads ausführen müssen, ist ein Vorschlag (oder alternativer Weg) mit einem einfachen Kontrollpool:

1 - Pass Ihren Kontext (EJB) als Parameter an Ihre Methode (Rest Endpoint, Scheduler, Standardmethoden)

2 - steuern Sie den Zustand mit komplementären Scheduler- oder Entity-Flaggen 3 - Seien Sie vorsichtig mit dem Datenvolumen / Verarbeitung

4 - Empfehlungen: Metriken, Protokolle und Tests, Tests, Tests werden stark empfohlen

5 - Dieser Code ist auf dem Springboot, wurde jedoch in JBoss (mit Modifikationen) unter EJB-Kontext getestet - Test sorgfältig

6 - Verwenden / Ändern, wie Sie möchten: (Vorschläge / Kommentare senden)

basecontroledecutor.java

generasacodicetagpre.

endpointcontrolrest.java

generasacodicetagpre.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top