Ausführen eines regulären Hintergrundereignisses in der Java Web App

8

In Podcast # 15 erwähnte Jeff, dass er darüber twitterte, wie man ein reguläres Event im Hintergrund ablaufen lässt, als ob es eine normale Funktion wäre - leider kann ich das durch Twitter nicht finden. Jetzt muss ich etwas Ähnliches tun und werde die Frage den Massen stellen.

Mein aktueller Plan ist, wenn der erste Benutzer (wahrscheinlich ich) die Site betritt, startet er einen Hintergrund-Thread, der bis zur zugewiesenen Zeit (stündlich) wartet und dann das Ereignis startet, das die anderen blockiert (Ich bin ein Windows-Programmierer Ich denke also in Bezug auf Ereignisse und WaitOnMultipleObjects, bis es abgeschlossen ist.

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

    
graham.reeds 07.09.2008, 10:25
quelle

5 Antworten

12

Ich denke, dass die Entwicklung einer benutzerdefinierten Lösung für die Ausführung von Hintergrundaufgaben nicht immer sinnvoll ist. Daher empfehle ich, den Quartz Scheduler zu verwenden in Java.

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

Danach haben Sie eine Reihe von Möglichkeiten, Ihre Hintergrundaufgaben (Jobs) zu starten (auszulösen), z. Sie können Kalender oder Cron-ähnliche Ausdrücke verwenden. In deiner Situation solltest du dich wahrscheinlich mit SimpleTrigger begnügen, damit du rennen kannst Jobs in festen, regelmäßigen Abständen.

Die Jobs selbst können auch in Quartz leicht beschrieben werden, aber Sie haben keine Details darüber angegeben, was Sie ausführen müssen. Daher kann ich in diesem Bereich keinen Vorschlag machen.

    
Zizzencs 07.09.2008, 11:25
quelle
5

Wie bereits erwähnt, ist Quarz eine Standardlösung. Wenn Sie sich bei Neustarts nicht für das Clustering oder die Persistenz von Hintergrundaufgaben interessieren, können Sie die integrierte ThreadPool-Unterstützung (in Java 5,6) verwenden. Wenn Sie eine ScheduledExecutorService verwenden Sie können Runnables in den Hintergrund-Thread-Pool einfügen, die vor der Ausführung eine gewisse Zeit warten.

Wenn Sie sich für Clustering und / oder Persistenz interessieren, können Sie JMS-Warteschlangen für die asynchrone Ausführung verwenden, Sie müssen jedoch einige Hintergrundaufgaben verzögern (dazu können Sie Quartz oder den ScheduledExecutorService verwenden).

>     
Paul Lorenz 07.09.2008 11:35
quelle
3

Jeffs Mechanismus bestand darin, eine Art zwischengespeichertes Objekt zu erstellen, das ASP.Net automatisch in einer bestimmten Art von Intervall neu erstellte - es schien eine ASP.Net-spezifische Lösung zu sein, also wird es Ihnen wahrscheinlich (oder mir) nicht helfen Java-Welt.

Siehe Ссылка

  

Atwood: Nun, ich habe ursprünglich auf Twitter gefragt, weil ich einfach etwas Leichtes wollte. Ich wollte wirklich nicht gerne einen Windows-Dienst schreiben. Ich hatte das Gefühl, dass das Out-of-Band-Code war. Plus der Code, der tatsächlich die Arbeit macht, ist eine Webseite in der Tat, denn für mich ist das eine logische Einheit der Arbeit auf einer Website eine Webseite. Also, es ist wirklich so, als würden wir auf die Website zurückrufen, es ist genau wie eine andere Anfrage auf der Website, also habe ich es als etwas angesehen, das inline bleiben sollte, und die kleine Herangehensweise, die uns auf Twitter empfohlen wurde Im Wesentlichen sollte man dem Anwendungscache etwas mit einem festen Ablauf hinzufügen, dann hat man einen Rückruf, so dass wenn er abläuft, er eine bestimmte Funktion aufruft, die die Arbeit erledigt, dann fügt man ihn mit demselben Ablauf wieder in den Cache ein. Also, es ist ein bisschen, vielleicht ist "Ghetto" das richtige Wort.

Mein Ansatz war immer, dass das Betriebssystem (dh Cron oder der Windows-Taskplaner) in einem bestimmten Intervall eine bestimmte URL lädt und dann eine Seite unter dieser URL einrichtet, um die Warteschlange zu prüfen und alle erforderlichen Aufgaben auszuführen Es würde mich interessieren, ob es einen besseren Weg gibt.

Aus dem Transkript sieht es so aus, als ob FogBugz den Windows-Dienst verwendet, der auch einen URL-Ansatz lädt.

  

Spolsky: Also haben wir diese spezielle Seite namens heartbeat.asp. Und diese Seite, wann immer Sie es treffen, und jeder kann es jederzeit treffen: tut nicht weh. Aber wenn diese Seite ausgeführt wird, prüft sie eine Warteschlange mit wartenden Aufgaben, um zu sehen, ob etwas getan werden muss. Und wenn es etwas gibt, was getan werden muss, macht es eine Sache und schaut dann wieder in diese Warteschlange und wenn es noch etwas zu tun gibt, gibt es ein Plus zurück und die gesamte Webseite, die es zurückgibt, ist nur ein einzelnes Zeichen mit einem Plus drin. Und wenn nichts anderes zu tun ist, ist die Warteschlange jetzt leer, sie gibt ein Minuszeichen zurück. Also, jeder kann dies aufrufen und es so oft drücken, dass Sie heartbeat.asp laden können. In Ihrem Webbrowser drücken Sie Strg-R Strg-R Strg-R Strg-R, bis Sie Minuspunkte anstelle von Pluszeichen erhalten. Und wenn Sie dies getan haben, wird FogBugz alle erforderlichen Wartungsarbeiten abgeschlossen haben. Also das ist der erste Teil, und der zweite Teil ist ein sehr, sehr einfacher Windows-Dienst, der ausgeführt wird, und seine ganze Aufgabe ist es, Heartbeat.asp aufzurufen, und wenn es ein Plus bekommt, rufen Sie es bald wieder auf, und wenn es einen Minus-Anruf bekommt es wieder, aber nicht für eine Weile. Also im Grunde gibt es diesen Windows-Dienst, der immer läuft, der eine sehr, sehr, sehr einfache Aufgabe hat, einfach eine URL zu treffen und zu sehen, ob es ein Plus oder ein Minus bekommt, und dann zu planen, wann es wieder ausgeführt wird es hat ein Plus oder ein Minus bekommen. Und natürlich können Sie jede Art von Variation zu diesem Thema machen, wie zum Beispiel, äh, Sie könnten tatsächlich, statt nur ein Plus oder Minus zurück zu sagen, können Sie sagen: "Okay, rufen Sie mich zurück in 60 Sekunden" oder "Ruf mich zurück weg muss ich mehr arbeiten. " Und so funktioniert es ... so dass der Wartungsdienst einfach ausgeführt wird, wissen Sie, es ist wie eine halbe Code-Seite, die diesen Wartungsdienst ausführt, und sie muss sich nie ändern, und sie hat auch keine von der Logik darin, es enthält nur das Kitzeln, das diese Webseiten veranlasst, mit einer bestimmten garantierten Frequenz angerufen zu werden. Und auf dieser Webseite gibt es bei heartbeat.asp einen Code, der eine Warteschlange von Aufgaben verwaltet, die erledigt werden müssen, und sieht, wie viel Zeit verstrichen ist, und macht, wie Sie wissen, alle sieben Tage alle alten Nachrichten, die das sind wurden als Spam und alle Arten von Wartungsaufgaben im Hintergrund markiert. Und äh, so macht das das.

    
Matt Sheppard 07.09.2008 10:31
quelle
2

Wir verwenden jtcron für unsere geplanten Hintergrundaufgaben. Es funktioniert gut, und wenn Sie Cron verstehen, sollte es für Sie Sinn machen.

    
ScArcher2 07.09.2008 15:55
quelle
1

So machen sie es auf StackOverflow.com:

Ссылка

    
Espo 07.09.2008 10:37
quelle

Tags und Links