Angenommen, ich habe eine Datenbank mit einer Tabelle, jeder Datensatz in dieser Tabelle entspricht einer auszuführenden Aktion. Diese Tabelle hat ein Datetime-Feld, in dem der nächste Moment gespeichert wird, in dem die Aktion ausgeführt werden soll.Laufender zeitgesteuerter Job
Diese Tabelle wird von einem Windows-Dienst gelesen und die Aktionen werden in einer Datenstruktur gespeichert. Alle paar Minuten liest der Dienst die Tabelle und neue Aktionen werden in der Datenstruktur zusammengeführt, so dass in der Zwischenzeit erstellte Aktionen nicht ausgelassen werden.
Jede Aktion hat ein bestimmtes Wiederholungsintervall. Wenn eine Aktion ausgeführt wurde, wird das Datum/Uhrzeit-Feld auf den nächsten Moment aktualisiert, in dem es basierend auf diesem Intervall ausgeführt werden sollte.
Jetzt hier ist, wo ich über die richtige Vorgehensweise frage: Was ist der bevorzugte Weg, um die Aktion bei seiner vorgegebenen Zeit tatsächlich zu starten?
Angenommen, ich habe eine Aktion, die um 09:00 Uhr in der Datenstruktur ausgeführt werden sollte. Wie stelle ich sicher, dass sie um 09:00 Uhr ausgelöst wird? Was ich derzeit im Sinn habe, ist die Datenstruktur jede Minute zu überprüfen, die aktuelle Zeit mit der geplanten Aktion zu vergleichen und, falls sie übereinstimmen, die Aktion auszuführen und die Ausführungszeit der Aktion entsprechend dem zugehörigen Intervall zu aktualisieren.
Als Datenstruktur tendiere ich dazu, in der Warteschlange zu denken, damit ich den nächsten Job vor mir haben kann und nur den ersten prüfen muss, aber dann muss ich die Warteschlange neu anordnen, wenn neue Aktionen gefunden werden.
Mein wichtigster Punkt ist ein guter Ansatz, um zu überprüfen, ob eine Aktion ausgeführt werden sollte, eine geeignete Datenstruktur wird folgen. Die Anzahl der Aktionen in der Tabelle wird sehr niedrig sein, nicht mehr als 25. Ich habe keine Kontrolle über die Datenbank, also sollte alles programmgesteuert in C# erledigt werden, falls Sie sich fragen. Irgendwelche Tipps, Erfahrungen oder Ratschläge?
Haben Sie -need - eine Datenbank? Wer initiiert die geplanten Aufgaben? –
Hängt vom System ab; In einer db (oder ähnlich) können Sie den Systemzustand beibehalten, falls das System umfällt. –
Ja, eine Datenbank wird als zentraler Punkt zum Hinzufügen neuer Aktionen usw. benötigt. Natürlich ist das nur ein kleiner Teil des Systems. Die einzige Diskussion sollte die Art sein, wie die Zeiten überprüft werden. – Oxymoron