Zum Hauptinhalt springen

Cron-Jobs

Zweck

CronJob modelliert wiederkehrende Aufgaben in SpeamCore. Pro Job wird ein Cron-Schedule (schedule, klassisches Cron-Format), eine Zeitzone (timezone, IANA), ein Aktiv-Flag (enabled) und der polymorphe Parent (parentType/parentId) gepflegt. Backend nutzt BullMQ + Redis zur Ausführung; ein Lock-Mechanismus (lockedBy, lockedAt) verhindert Doppellauf.

CronJobs werden typischerweise nicht direkt erstellt, sondern durch Modul-Workflows referenziert — z. B. erzeugt eine wiederkehrende Ausgabe automatisch einen CronJob für monatliche Buchungs-Erzeugung.

Voraussetzungen

- Berechtigung `view:CronJob` und ggf. `create:CronJob`. - Für manuellen Run: `do:RunCronJob`. - Backend-Worker (BullMQ + Redis) muss laufen.

Berechtigungen (CASL)

ActionSubjectWirkungKeycloak-Rolle
viewFE_CronJob, CronJobListe/Detail aufrufbar
create/update/deleteCronJobPflegenAPP_SPEAMCORE_CREATE/UPDATE/DELETE_CRON_JOB
doRunCronJobManueller „Run Now"-AufrufAPP_SPEAMCORE_DO_RUN_CRON_JOB

Schritt-für-Schritt-Anleitung

Eigenen CronJob anlegen

  1. Cron-Jobs (/cron-jobs) → + Neu.
  2. name und description pflegen.
  3. Schedule über cronSchedule-Field — Cron-Notation (z. B. 0 3 * * * für „täglich um 3 Uhr").
  4. timezone wählen — IANA-Liste aus Intl.supportedValuesOf("timeZone").
  5. enabled = true setzen, damit der Job durch den Worker ausgeführt wird.

Last-Run-Status prüfen

Liste zeigt lastRunAt, lastRunStatus (success, failed) und lastRunError. Bei Fehler ist die Detail-Sicht der schnellste Weg zum Stack-Trace.

Manueller Lauf

Bei Berechtigung do:RunCronJob ist ein Button Jetzt ausführen sichtbar — POST /api/cron-jobs/:id/run-now.

Listenansicht — cron-jobs

Felder und Eingaben

FeldnamePflichtDatentypWirkung beim AusfuellenVoraussetzung
nameneinStringAnzeigename.
descriptionneinTEXTErlaeuterung.
scheduleneinString (Cron)Cron-Schedule (z. B. 0 0 * * *).Gueltige Cron-Notation.
timezoneneinString (IANA)Zeitzone der Ausführung.
enabledjaBooleanAktiv-Flag.
parentId/parentTypeneinPolymorphVerknuepfung zu auslоsendem Modell (z. B. Expense).
lockedBy, lockedAtnein (read-only)String / DateTimeLock-Mechanismus zur Vermeidung von Doppellauf.
lastRunAtnein (read-only)DateTimeZeit des letzten Laufs.
lastRunStatusnein (read-only)Stringsuccess / failed.
lastRunErrornein (read-only)TEXTFehler-Details.

Wiederverwendbare Konzepte

Verknuepfungen zu anderen Modulen

  • Ausgaben — wiederkehrende Ausgaben referenzieren cronJobId für monatliche Erzeugung.
  • Notification-Events — koennen über CronJobs ausgeloest werden.
  • Datentransfer — automatische Exporte koennen über CronJobs laufen.

Häufige Fehler und Lösungen

FehlerLösung
Job laeuft nicht trotz enabled = trueWorker-Prozess (BullMQ) nicht aktiv oder Redis nicht erreichbar.
lastRunStatus = failed permanentlastRunError einsehen, Backend-Logs durchsuchen.
Lock haengtlockedBy/lockedAt manuell zuruecksetzen, falls Worker abgestuerzt ist.
DoppellaufLock-Mechanismus prüfen — lockedBy sollte beim Lauf gesetzt sein.

API/Schnittstellen

MethodeEndpointZweckCASL
GET/api/cron-jobsListeview CronJob
POST/api/cron-jobsAnlegencreate CronJob
GET/api/cron-jobs/:idDetailview CronJob
PATCH/api/cron-jobs/:idÄndernupdate CronJob
DELETE/api/cron-jobs/:idSoft-Deletedelete CronJob
POST/api/cron-jobs/:id/run-nowManueller Laufdo RunCronJob

Versionshinweise

  • 2026-04-30: Initiale Veroeffentlichung.