none
Wie Ausführungszeiten von CronJobs mit der aktuellen Zeit vergleichen? RRS feed

  • Frage

  • Hallo,
    ich habe mehrere CronJobs. Mit reinen C#-Mitteln, also ohne ein zusätzliches Tool, will ich ausgehend vom aktuellen Datum und Uhrzeit die Ausführungszeiten der CronJobs durchsuchen um festzustellen, welcher Job als nächstes ausgeführt werden soll.
    Die Ausführungszeit existiert als String:
    30:9:1-31:1-12
    0,5:6,10,14:1-31:1-12
    0:0:1:1-12

    Der Aufbau des Zeit-Strings ist typisch für die Zeitangabe eines CronJobs: Minuten, Stunden, Tage, Monate

    Wie kann ich die Zeiten der CronJobs mit der aktuellen Zeit vergleichen, um den nächsten auszuführenden CronJob zu ermitteln?


    Alexander

    Freitag, 29. Mai 2015 11:24

Antworten

  • Hallo,

    es ist zunächst wichtig Detailliert zu wissen wie die Strings aufgebaut sein können. Ich gehe jetzt mal auf die Syntaktischen Elemente ein, die in den Beispielen dieses Wikipedia-Artikels zu finden sind.

    Zunächst solltest du die einzelnen Teile heraus bekommen:

    var parts = myString.Split(':');
    Nun kannst du die verschiedenen Teile ordentlich analysieren. Ich empfehle dir dabei eine spezielle Klasse zu erstellen:
    public class CronJob
    {
        public CronJobPart Minute { get; set; }
        public CronJobPart Houre { get; set; }
        public CronJobPart Day { get; set; }
        public CronJobPart Month { get; set; }
        public CronJobPart WeekDay { get; set; }
    
        public static CronJob Parse(string value)
        {
            var parts = value.Split(':');
    
            return new CronJob()
            {
                Minute = parts.Length > 0 ? CronJobPart.Parse(parts[0]) : new CronJobPart() { IsStar = true },
                Houre = parts.Length > 1 ? CronJobPart.Parse(parts[1]) : new CronJobPart() { IsStar = true },
                Day = parts.Length > 2 ? CronJobPart.Parse(parts[2]) : new CronJobPart() { IsStar = true },
                Month = parts.Length > 3 ? CronJobPart.Parse(parts[3]) : new CronJobPart() { IsStar = true },
                WeekDay = parts.Length > 4 ? CronJobPart.Parse(parts[4]) : new CronJobPart() { IsStar = true },
            };
        }
    }
    
    public class CronJobPart
    {
        public bool IsStar { get; set; }
        public int[] Numbers { get; set; }
        public bool IsFromTo { get; set; }
    
        internal static CronJobPart Parse(string p)
        {
            var res = new CronJobPart();
            if (p.StartsWith("*"))
            {
                res.IsStar = true;
                if (p.Length > 2)
                    p = p.TrimStart(new char[] { '*', '/' });
            }
    
            if (p.Contains("-"))
            {
                //Bereichsangabe (Mo-Fr o.ä.)
                var p2 = p.Split('-');
                res.Numbers = new int[] { int.Parse(p2[0]), int.Parse(p[1]) };
                res.IsFromTo = true;
            }
            else
            {
                var l = new List<int>();
                foreach (var p2 in p.Split(','))
                    l.Add(int.Parse(p2));
                res.Numbers = l.ToArray();
            }
            return res;
        }
    }
    Ich habe den Code nicht weiter getestet, da ich auch nicht weiß was es noch für Besonderheiten zu beachten gibt. Er sollte aber die Idee meines Vorgehens gut zeigen.

    In die CronJob-Klasse kannst du nun noch eine Methode oder einen Operator zum vergleichen einbauen um heraus zu bekommen welcher vor dem anderen Steht. Über LINQs Erweiterungsmethode OrderBy lässt sich dann auch einfach eine ganze Liste sortieren.


    Tom Lambert - .NET (C#) MVP
    Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
    Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
    Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets

    • Als Antwort vorgeschlagen Tobias Scholze Freitag, 29. Mai 2015 13:17
    • Als Antwort markiert AlexanderRi Samstag, 30. Mai 2015 15:31
    Freitag, 29. Mai 2015 13:12
    Moderator