Automatisierung von Jobs / @EJB Scheduler / Verhinderung, dass Queue überläuft

beta20

Top Contributor
Hallo zusammen,

ich baue eine Applikation, die mehrere User hat.
Jeder User kann Jobs einplanen, die zu einem bestimmten Datum / Uhrzeit laufen sollen.
Dies kann bspw. sein:

- Erinnerung per Email senden
- Automatische Email verschicken (z.B. an Kunde)
- Automatisch ein Angebot erstellen + verschicken
- usw.

Im Moment habe ich hierzu eine DB-Tabelle.
- ID
- plannedExecutionDate
- status (STARTED, OUTSTANDING...)

In meinem @EJB - Container habe ich einen Scheduler eingerichtet, der jede Minute prüft, ob es in der DB ausstehende Einträge gibt, die über dem plannedExecutionDate sind.
Wenn ja, werden diese ausgeführt.
Innerhalb einer Schleife werden diese dann ausgeführt.
- Per Applikation Server manage ich diese Anzahl an Threads
- Jede ausgeführte Aktivität läuft in einem eigenen Thread

Welche Frage ich mir nun allerdings stelle:
- Was passiert, wenn es Jobs gibt, die alles blockieren?
- Bspw. eine Email wird nicht versendet und hängt noch in der Queue?

-> Habe ich z.B. die Möglichkeit diese automatisiert abzubrechen (wenn sie ein gewisses Zeitlimit überstiegen haben).

Oder wie kann ich das machen?
Ich habe Angst, dass das System irgendwann durch solche Jobs blockiert wird.

Vielen Dank
 

beta20

Top Contributor
Hat hier jemand einen Tipp und kann helfen?
Es geht mir um Jobs, die eigentlich längst zu Ende sein sollten, aber doch noch in der Queue hängen (warum auch immer) und somit blockieren, dass weitere Jobs ausgeführt werden können....

- Macht es Sinn bei Jobs einen Typ und eine vorgesehene Zeit hinzuzufügen.

Beispiel:
Emailversand:
- Type = SEND_MAIL
- PlannedTime = 1 Minute

Wenn nun:
Die Differenz zwischen StartDate und PlannedTime größer als 1 Minute ist, soll der Job abgebrochen werden....
-> Der Schedule läuft ja jede Minute, dann wird diese Prüfung ebenfalls angestoßen...

Oder welche Ansätze gibt es hier?
 

mihe7

Top Contributor
Das lässt sich pauschal nicht 100 %-ig verhindern. Selbst mit Thread#stop() (eine Methode, die niemals(!) verwendet werden sollte und seit Java 1.2 deprecated ist, weil sie zu defekten Objekten und unvorhergesehenem Verhalten führt) können Threads nicht immer beendet werden. Ein System.in.read() blockiert zum Beispiel bis zum Sankt-Nimmerleins-Tag. Einen Thread, der dadurch blockiert wird, kannst Du nicht abbrechen.

Du musst selbst dafür sorgen, dass ein Thread beendet werden kann.

Die Frage ist also nicht, wie man einen Thread abbrechen kann, sondern warum Dein Thread nicht zu einem Ende kommt. Weil Du E-Mail-Versand erwähnt hast, könnte das z. B. daran liegen, dass Dein Thread ewig auf eine Antwort vom Server wartet. Lösung: ein passendes Timeout setzen. JavaMail kennt Timeout-Parameter für den Verbindungsaufbau und den Datenempfang. Blockade gelöst -> Thread wird beendet.
 

Ähnliche Java Themen

Neue Themen


Oben