Ich verwende Java und möchte ein Servlet in meiner Anwendung kontinuierlich ausführen, aber ich verstehe nicht, wie es geht. Mein Servlet verfügt über eine Methode, die täglich die Anzahl der Benutzer aus einer Datenbank sowie die Gesamtzahl der Benutzer aus der gesamten Datenbank angibt. Deshalb möchte ich das Servlet dafür kontinuierlich laufen lassen.
97
Antworten:
Ihr Problem ist, dass Sie den Zweck des Servlets falsch verstehen . Es ist beabsichtigt, auf HTTP-Anfragen zu reagieren, nicht mehr. Sie möchten nur eine Hintergrundaufgabe, die einmal täglich ausgeführt wird.
EJB verfügbar? Verwenden
@Schedule
Wenn Ihre Umgebung EJB unterstützt (dh einen echten Java EE-Server wie WildFly, JBoss, TomEE, Payara, GlassFish usw.), verwenden Sie
@Schedule
stattdessen. Hier sind einige Beispiele:Ja, das ist wirklich alles. Der Container nimmt ihn automatisch auf und verwaltet ihn.
EJB nicht verfügbar? Verwenden
ScheduledExecutorService
Wenn Ihre Umgebung EJB nicht unterstützt (dh Sie verwenden keinen echten Java EE-Server, sondern einen Barebone-Servlet-Container wie Tomcat, Jetty usw.), verwenden Sie
ScheduledExecutorService
. Dies kann durch a eingeleitet werdenServletContextListener
. Hier ist ein Kickoff-Beispiel:Wo die Jobklassen so aussehen:
Denken Sie niemals daran,
java.util.Timer
/java.lang.Thread
in einer Java EE / Servlet-basierten Umgebung zu verwendenLast but not least, niemals direkt
java.util.Timer
und / oderjava.lang.Thread
in Java EE verwenden. Dies ist ein Rezept für Ärger. Eine ausführliche Erklärung finden Sie in dieser JSF-bezogenen Antwort auf dieselbe Frage: Laichen von Threads in einer von JSF verwalteten Bean für geplante Aufgaben mithilfe eines Timers .quelle
ScheduledExecutorService
: Achten Sie darauf, alle Ausnahmen in Ihrem Executor zu erfassen . Wenn eine Ausnahme von Ihrerrun
Methode ausgeht, beendet der Executor die Ausführung stillschweigend. Dies ist eine Funktion, kein Fehler. Lesen Sie das Dokument und lernen Sie etwas googeln.scheduler.shutdownNow()
gemäß Beispiel nicht korrekt aufgerufen wird. Wenn dies nicht aufgerufen wird, wird der Zeitplan-Thread tatsächlich weiter ausgeführt.Ich würde vorschlagen, eine Bibliothek wie Quarz zu verwenden, um die Aufgabe in regelmäßigen Abständen auszuführen. Was macht das Servlet wirklich? Es sendet Ihnen einen Bericht?
quelle
Implementieren Sie zwei Klassen und rufen Sie
startTask()
anmain
.quelle
Sie können cron4j verwenden. http://www.sauronsoftware.it/projects/cron4j/manual.php
quelle
In einem Produktionssystem, in dem möglicherweise mehrere Nicht-Jee-Container ausgeführt werden. Verwenden Sie einen anderen Enterprise-Scheduler wie den Quartz-Scheduler, der so konfiguriert werden kann, dass eine Datenbank für die Aufgabenverwaltung verwendet wird.
quelle