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?
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 .:
.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):
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 ...
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.
Für eine einfache Hintergrundaufgabe benötigen Sie überhaupt keinen Thread-Pool. Alles, was Sie tun müssen, ist:
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.
Tags und Links java multithreading tomcat threadpool