Ausführen eines regelmäßigen Hintergrundereignisses in der Java-Web-App

StackOverflow https://stackoverflow.com/questions/48293

  •  09-06-2019
  •  | 
  •  

Frage

In Podcast Nr. 15 erwähnte Jeff, dass er darüber getwittert hat, wie man ein reguläres Event im Hintergrund laufen lässt, als wäre es eine normale Funktion – leider kann ich das über Twitter nicht finden.Jetzt muss ich etwas Ähnliches tun und werde die Frage an die Massen richten.

Mein aktueller Plan sieht vor, dass, wenn der erste Benutzer (wahrscheinlich ich) die Site betritt, ein Hintergrundthread gestartet wird, der bis zur zugewiesenen Zeit wartet (stündlich) und dann das Ereignis startet, das die anderen blockiert (ich bin von Beruf Windows-Programmierer). Ich denke in Bezug auf Ereignisse und WaitOnMultipleObjects, bis es abgeschlossen ist.

Wie hat Jeff das in Asp.Net gemacht und ist seine Methode auf die Java-Web-App-Welt anwendbar?

War es hilfreich?

Lösung

Ich denke, dass es sich nicht immer lohnt, eine benutzerdefinierte Lösung für die Ausführung von Hintergrundaufgaben zu entwickeln, daher empfehle ich die Verwendung von Quarzplaner in Java.

In Ihrer Situation (Sie müssen Hintergrundaufgaben in einer Webanwendung ausführen) können Sie den in der Verteilung enthaltenen ServletContextListener verwenden Initialisieren Sie die Engine beim Start Ihres Webcontainers.

Danach haben Sie eine Reihe von Möglichkeiten, Ihre Hintergrundaufgaben (Jobs) zu starten (triggern), z.B.Sie können Kalender oder Cron-ähnliche Ausdrücke verwenden.In Ihrer Situation sollten Sie sich höchstwahrscheinlich damit zufrieden geben SimpleTrigger Damit können Sie Jobs in festen, regelmäßigen Abständen ausführen.

Die Jobs selbst lassen sich auch in Quartz leicht beschreiben, Sie haben jedoch keine Details darüber angegeben, was Sie ausführen müssen, sodass ich in diesem Bereich keinen Vorschlag machen kann.

Andere Tipps

Wie bereits erwähnt, ist Quartz eine Standardlösung.Wenn Ihnen das Clustering oder die Persistenz von Hintergrundaufgaben über Neustarts hinweg egal ist, können Sie die integrierte ThreadPool-Unterstützung (in Java 5,6) verwenden.Wenn Sie a verwenden ScheduledExecutorService Sie können Runnables in den Hintergrund-Thread-Pool einfügen, die eine bestimmte Zeit warten, bevor sie ausgeführt werden.

Wenn Ihnen Clustering und/oder Persistenz am Herzen liegen, können Sie JMS-Warteschlangen für die asynchrone Ausführung verwenden. Allerdings benötigen Sie dennoch eine Möglichkeit, Hintergrundaufgaben zu verzögern (Sie können hierfür Quartz oder den ScheduledExecutorService verwenden).

Jeffs Mechanismus bestand darin, eine Art zwischengespeichertes Objekt zu erstellen, das ASP.Net in bestimmten Abständen automatisch neu erstellte. Es schien eine ASP.Net-spezifische Lösung zu sein und wird Ihnen (oder mir) in der Java-Welt wahrscheinlich nicht viel helfen.

Sehen https://stackoverflow.fogbugz.com/default.asp?W13117

Atwood:Nun, ich habe ursprünglich auf Twitter nachgefragt, weil ich einfach etwas Leichtes wollte.Ich wollte wirklich nicht gerne einen Windows-Dienst schreiben.Ich hatte das Gefühl, dass das außerhalb des Bandcodes lag.Außerdem ist der Code, der die Arbeit tatsächlich erledigt, tatsächlich eine Webseite, denn für mich ist das eine logische Arbeitseinheit auf einer Website.Es ist also wirklich so, als würden wir wieder auf die Website zurückrufen, es ist einfach wie eine weitere Anfrage auf der Website, also habe ich es als etwas angesehen, das inline bleiben sollte, und den kleinen Ansatz, den wir uns ausgedacht haben und der mir auf Twitter empfohlen wurde Im Wesentlichen ging es darum, etwas mit einem festen Ablaufdatum zum Anwendungscache hinzuzufügen, und dann gibt es einen Rückruf. Wenn dieser abläuft, ruft er eine bestimmte Funktion auf, die die Arbeit erledigt, und fügt sie dann mit demselben Ablaufdatum wieder dem Cache hinzu.Es ist also ein bisschen, vielleicht ist „Ghetto“ das richtige Wort.

Mein Ansatz bestand immer darin, das Betriebssystem (d. h.Cron oder der Windows-Aufgabenplaner) laden in bestimmten Abständen eine bestimmte URL und richten dann eine Seite unter dieser URL ein, um deren Warteschlange zu überprüfen und alle erforderlichen Aufgaben auszuführen, aber ich würde gerne hören, ob es einen besseren Weg gibt.

Aus dem Transkript geht hervor, dass FogBugz auch den Windows-Dienst zum Laden einer URL verwendet.

Spolsky:Wir haben also diese spezielle Seite namens heartbeat.asp.Und diese Seite, wann immer Sie darauf klicken, und jeder kann jederzeit darauf zugreifen:tut nicht weh.Aber wenn diese Seite ausgeführt wird, überprüft sie eine Warteschlange mit wartenden Aufgaben, um zu sehen, ob etwas getan werden muss.Und wenn etwas getan werden muss, führt es eine Sache aus und schaut dann erneut in der Warteschlange nach. Wenn noch etwas zu tun ist, gibt es ein Plus zurück, und die gesamte zurückgegebene Webseite besteht nur aus einem einzelnen Zeichen mit einem Plus drin.Und wenn nichts anderes zu tun ist, ist die Warteschlange jetzt leer und es wird ein Minus zurückgegeben.Jeder kann dies also aufrufen und so oft drücken, Sie können heartbeat.asp in Ihrem Webbrowser laden, indem Sie Strg-R Strg-R Strg-R Strg-R drücken, bis Sie Minuspunkte statt Pluspunkte erhalten.Und wenn Sie das getan haben, hat FogBugz alle erforderlichen Wartungsarbeiten abgeschlossen.Das ist also der erste Teil, und der zweite Teil ist ein sehr, sehr einfacher Windows-Dienst, der ausgeführt wird und dessen einzige Aufgabe darin besteht, heartbeat.asp aufzurufen. Wenn es ein Plus erhält, rufen Sie es bald erneut auf, und wenn es ein Minus erhält, rufen Sie es auf es wieder, aber nicht für eine Weile.Im Grunde gibt es also diesen Windows-Dienst, der ständig läuft und dessen sehr, sehr, sehr einfache Aufgabe darin besteht, einfach eine URL anzurufen, zu prüfen, ob sie ein Plus oder ein Minus erhält, und dann abhängig davon zu planen, wann sie erneut ausgeführt wird es gab ein Plus oder ein Minus.Und offensichtlich können Sie jede Art von Variation durchführen, die Sie zu diesem Thema wollen, wie zum Beispiel, äh Sie tatsächlich, anstatt nur ein Plus oder Minus zurückzukehren, könnten Sie sagen "Okay, ruf mich in 60 Sekunden zurück" oder "Rufen Sie mich richtig zurück Außerdem habe ich mehr Arbeit zu erledigen. " Und so funktioniert es ...Damit dieser Wartungsdienst einfach ausgeführt wird, wissen Sie, ist es wie eine halbe Seite Code, die diesen Wartungsdienst ausführt, und er muss sich nie ändern, und er enthält keinerlei Logik, sondern einfach enthält das Kitzeln, das dazu führt, dass diese Webseiten mit einer bestimmten garantierten Häufigkeit aufgerufen werden.Und auf dieser Webseite unter heartbeat.asp gibt es Code, der eine Warteschlange von Aufgaben verwaltet, die erledigt werden müssen, und der prüft, wie viel Zeit verstrichen ist, und, Sie wissen schon, eine Wartung bis spät in die Nacht durchführt und alle sieben Tage alle älteren Nachrichten löscht wurden als Spam markiert und alle Arten von reinen Wartungsaufgaben im Hintergrund.Und so funktioniert das.

Wir gebrauchen jtcron für unsere geplanten Hintergrundaufgaben.Es funktioniert gut, und wenn Sie cron verstehen, sollte es für Sie einen Sinn ergeben.

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