Table of Contents

Zeitpläne mit Cron und Every

[Cron] und [Every] starten Actions automatisch nach Zeitplan. Sie werden als zusätzliches Attribut direkt an der Action-Methode definiert. Auf Datenänderungen reagiert dagegen OnChanged.

Die Action bleibt manuell ausführbar. Automatische Läufe erscheinen mit ihrem Trigger in der Ausführungshistorie.

Feste Zeitpläne mit [Cron]

[Cron] eignet sich für Ausführungen zu festen Zeitpunkten. Das folgende Beispiel liest stündlich die EZB-Referenzkurse und aktualisiert damit die Fremdwährungen des Mandanten.

public sealed class FremdwaehrungKurseModule(
    IBpSession session,
    IHttpClientFactory httpClientFactory) : BpModule
{
    private const string EcbDailyRatesUrl = "https://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml";

    public override string ModuleName => "EZB Fremdwährungskurse";
    public override string ModuleVersion => "1.0.0";
    public override string ModuleDescription => "Aktualisiert die Fremdwährungskurse des Mandanten.";

    [Action("update-kurse", Display = "EZB Kurse aktualisieren")]
    [Cron("0 * * * *")]
    public async Task<KursUpdateResult> UpdateKurseAsync(CancellationToken cancellationToken)
    {
        var envelope = await httpClientFactory.CreateClient()
            .GetFromXmlAsync<EcbEnvelope>(EcbDailyRatesUrl, cancellationToken).ConfigureAwait(false);
        var daily = envelope.Days.First();

        var mandant = session.QueryDataSet<Mandant>().First();
        var aktualisiert = new List<string>();

        foreach (var fremdwaehrung in mandant.FrW)
        {
            // Währungen mit Festkurs behalten ihren manuell gepflegten Faktor.
            if (fremdwaehrung.FestKursKz == true)
                continue;

            var kurs = daily.Kurse.FirstOrDefault(k => k.Currency == fremdwaehrung.ISOBez);
            if (kurs is null)
                continue;

            // Der Feed listet Einheiten je EUR, microtech ERP speichert den Kehrwert (EUR je Einheit).
            fremdwaehrung.BaWFak = Math.Round(1d / kurs.Rate, 4);
            fremdwaehrung.LtzDat = daily.Date;
            fremdwaehrung.Save();
            aktualisiert.Add(kurs.Currency);
        }

        return new KursUpdateResult { RateDate = daily.Date, UpdatedCurrencies = aktualisiert };
    }
}

Cron-Ausdrücke haben fünf Felder: Minute, Stunde, Tag, Monat und Wochentag.

Ausdruck Bedeutung
0 * * * * jede volle Stunde
*/15 * * * * alle 15 Minuten
30 6 * * * täglich um 06:30
0 7 * * 1-5 Montag bis Freitag um 07:00

Für die Ausführungszeit gilt die in der geplanten Aufgabe konfigurierte Zeitzone.

Registrieren Sie IHttpClientFactory mit AddHttpClient (siehe Dependency Injection).

Feste Intervalle mit [Every]

Verwenden Sie [Every], wenn nur der Abstand zwischen zwei Läufen relevant ist:

[Action("postfach-pruefen", Display = "Postfach prüfen")]
[Every("00:15:00")]
public async Task PostfachPruefenAsync(CancellationToken cancellationToken) { ... }

Das kleinste unterstützte Intervall beträgt eine Minute.

Zeitpläne in Studio verwalten

Die Zeitpläne verwalten Sie unter Geplante Aufgaben in Studio. Dort lassen sie sich ändern, pausieren oder um weitere Aufgaben ergänzen.

Das Attribut liefert die Voreinstellung. Änderungen in Studio bleiben erhalten. Ein geänderter Triggerausdruck im Code kann eine neue Aufgabe erzeugen; prüfen Sie die Zeitpläne nach Updates.

Verhalten bei verpassten Läufen festlegen

CatchUp bestimmt, ob ausgefallene Läufe nachgeholt werden. Für Abfragen des aktuellen Stands genügt meist Skip. Bei zeitbezogener Verarbeitung kann Replay sinnvoll sein; die Action muss die zu verarbeitenden Zeiträume selbst bestimmen.

[Cron("0 * * * *", CatchUp = CatchUpMode.Skip)]     // aktueller Stand, nichts nachholen
[Every("01:00:00", CatchUp = CatchUpMode.Replay)]   // jeder Lauf zählt, nachholen
Wert Verhalten
Inherit Voreinstellung, die globale Einstellung der Runtime entscheidet
Skip Verpasste Läufe entfallen, es geht mit dem nächsten fälligen weiter
Replay Verpasste Läufe werden nachgeholt, einer pro Takt des Schedulers

Das Nachholfenster beträgt standardmäßig 24 Stunden.