tomcat 6-Thread-Pool für die asynchrone Verarbeitung

8

Kurze Frage: Wie kann ich in einer Tomcat 6 App einen (separaten) Thread-Pool ausführen?

Was ist die beste Lösung zum Ausführen eines Thread-Pools?

Lange Frage:
Ich habe hier ein einfaches Bedürfnis; Abfrage einer Datenbank nach einigen Daten, während Web-Clients auf eine Antwort warten können (lange Poll-Verbindungen).
Wenn diese Daten in der Datenbank verfügbar sind, sende ich eine Antwort an den entsprechenden Kunden.

Sagen wir es so, ich bevorzuge es im Moment nicht in irgendein Framework einzutauchen ( quartz scheduler vielleicht?).

Daher, ich schließe, brauche ich einen Thread-Pool, um die Arbeit im Hintergrund zu erledigen.

Wenn also Thread verwendet wird (eigentlich Runnable ), welche Klasse kann das alles organisieren? Gibt es eine Art ThreadPool Lösung? Irgendwelche Empfehlung?

    
Poni 15.06.2012, 11:54
quelle

3 Antworten

17

Beantworten Sie Ihre kurze Frage:

In JVM werden Threadpools hinter java.util.concurrent.ExecutorService interface abstrahiert. Es gibt verschiedene Implementierungen dieser Schnittstelle, aber in den meisten Fällen würden Methoden dieser Schnittstelle ausreichen.

Um einen spezifischen Thread-Pool zu erstellen, werfen Sie einen Blick auf java.util.concurrent.Executors class: Ссылка enthält statische Factory-Methoden zum Erstellen verschiedener Implementierungen von ExecutorService interface. Möglicherweise interessieren Sie sich für newFixedThreadPool(int threadsNumber) und newCachedThreadPool Methoden.

Für weitere allgemeine Informationen zu Executors in JVM sollten Sie das folgende Oracle-Lernprogramm lesen: Ссылка

Um den Thread-Pool ( ExecutorService ) unter Tomcat zu verwenden, sollten Sie Folgendes tun:

.1. Erstellen und registrieren Sie sich in web.xml instance von javax.servlet.ServletContextListener interface (was wie ein Einstiegspunkt in Ihre Webanwendung funktionieren würde), falls es noch nicht geschehen ist.

.2. In der Methode contextInitialized(ServletContextEvent) erstellen Sie eine Instanz von ExecutorService (Thread-Pool) und speichern sie in ServletContext attribute map, sodass auf sie von jedem beliebigen Punkt in Ihrer Webanwendung aus zugegriffen werden kann, z. B .:

%Vor%

.3. Irgendwo in Servlet.service method oder irgendwo in deiner Webapp (du solltest in der Lage sein, einen Verweis auf ServletContext fast überall von webapp zu bekommen):

%Vor%

Sie sollten einen Verweis auf myTask speichern und ihn von anderen Threads abfragen, um herauszufinden, ob er fertig ist und was das Ergebnis ist.

Hoffe, das hilft ...

    
Yura 15.06.2012, 14:56
quelle
0

Für Ihren Anwendungsfall können Sie Timer und TimerTask verwenden, die in der Java-Plattform verfügbar sind, um eine Hintergrundaufgabe in regelmäßigen Abständen auszuführen.

%Vor%

Hinweis: Wenn eine Aufgabe länger als fünf Minuten dauert, werden nachfolgende Aufgaben nicht parallel ausgeführt. Stattdessen warten sie in der Warteschlange und werden schnell nacheinander ausgeführt, wenn der vorherige beendet ist.

Sie können diesen Code in eine Singleton-Klasse einschließen und über das Start-Servlet aufrufen.

Im Allgemeinen ist es eine gute Vorgehensweise, diese Art von periodischen Hintergrundjobs außerhalb von Servlet-Containern auszuführen, da sie effizient HTTP-Anforderungen bedienen sollen.

    
sperumal 15.06.2012 14:11
quelle
0

Für eine einfache Hintergrundaufgabe benötigen Sie überhaupt keinen Thread-Pool. Alles, was Sie tun müssen, ist:

  1. Starten Sie einen Thread
  2. Überprüfen Sie, ob der Hintergrundprozess beendet werden soll
  3. Lassen Sie die Datenbank abfragen
  4. Speichern Sie frisch abgefragte Daten irgendwo zugänglich
  5. Überprüfen Sie, ob der Hintergrundprozess beendet werden soll
  6. Geh schlafen
  7. Wiederholen Sie die Schritte # 2- # 7

Schreiben Sie eine ServletContextListener , die einen Thread startet, um die oben genannten Schritte auszuführen, die Sie in einer Klasse definieren, die Runnable implementiert. Legen Sie in der Methode contextDestroyed ein Flag fest, das die oben in # 2 und # 5 angegebenen Überprüfungen auslöst, und ruft dann Thread.interrupt auf, damit Ihr Thread beendet wird.

Ihre Hintergrundaufgabe sollte auf keinen Fall versuchen, synchron Nachrichten an Clients zu senden. Informieren Sie wartende Poller stattdessen mit einem anderen Mechanismus wie Object.notify auf einem Monitor (was nicht wirklich sinnvoll ist, da Sie keine Clients blockieren möchten, die den aktuellen Status überprüfen), einen Zeitstempel aktualisieren oder einfach nur haben Die Polling-Clients überprüfen die aktuellen Daten in # 4.

    
Christopher Schultz 15.06.2012 20:10
quelle