Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Auslösen eines Java-Programms basierend auf Datenbankaktualisierungen und Zeitintervallen

Schreiben Sie einen einzelnen Job. Lassen Sie es regelmäßig ausführen.

Effektiv tun Sie so etwas wie:

SELECT count(*) FROM table WHERE new = 1;

(oder was auch immer)

Führen Sie das jede Sekunde aus, 5 Sekunden, 10 Sekunden, was auch immer basierend auf Ihrer Aktivität vernünftig erscheint.

Wenn Anzahl ==N, führen Sie Ihren Prozess aus. Wenn "Zeit seit letzter Ausführung" ==5 Minuten, führe deinen Prozess aus.

Der Vorgang ist derselbe, Sie überprüfen ihn nur häufiger mit den beiden Kriterien.

Dies bietet den Vorteil, dass Sie keine Rogue-Race-Bedingung erhalten, wenn der Job ZWEIMAL ausgelöst wird (weil Job A die Einfügungsanzahl gefunden hat, die zufällig 5 Minuten nach der Ausführung des letzten Jobs lag). Selten, ja, aber Rennbedingungen scheinen immer aktiv nach "seltenen" Ereignissen zu suchen, die "nie passieren".

Was das Scheduling betrifft, so ist ein Crontab einfach, da Sie Ihren Prozess nicht warten, am Leben erhalten, dämonisieren usw. usw. müssen.

Wenn Sie bereits einen langlebigen Container (App-Server, Tomcat usw.) verwenden, ist dieses Problem bereits gelöst und Sie können es einfach nutzen.

Der Nachteil von Cron ist seine Granularität, es läuft höchstens jede Minute. Wenn das zu lang ist, wird es für Sie nicht funktionieren. Aber wenn es in Ordnung ist, dann ist es wirklich wertvoll, einen einfachen Prozess zu haben, der einfach aufleuchtet, seine Prüfung durchführt und sich beendet. Natürlich muss es seinen Zustand irgendwie beibehalten (es könnte zum Beispiel in einem Job-Log nachsehen, wann der letzte Job ausgeführt wurde).

Innerhalb von Java gibt es viele Optionen:Raw Threads, Sleeping, Timers, ScheduledExecutorService, so etwas wie Quartz, EJB Timer Beans (wenn Sie einen Java EE-Container ausführen).

Aber ich bin ein KISS-Fan. Wenn ein Cron-Job es tun kann, lass es und mach es einmal.