2016-07-19 10 views
0

Ich habe eine WPF-Anwendung, in der der Benutzer Entitäten in der Datenbank erstellt. Jede Entität hat einige Metadaten und ein Intervallfeld. Für jede Entität möchte ich einen Job mit dem angegebenen Intervall erstellen und im AdoJobStore speichern. Jetzt, da die WPF-App nicht immer ausgeführt wird, möchte ich einen Windows-Dienst erstellen, der die Jobdaten aus dem AdoJobStore liest und diese Jobs ausführt.Quartz.net Konfiguration und Planung

Also im Wesentlichen gibt es diese 2 Ebenen. Jetzt habe ich die Quartz-Tabellen bereits in meiner bestehenden Datenbank eingerichtet. Meine Frage ist:

  • Wie bearbeiten/erstellen/löschen Jobs von meiner WPF-Anwendung
  • Wie kann ich meinen Windows-Dienst informieren, die Jobs (jedes Mal ein Unternehmen wird in der Datenbank erstellt) läuft

Ich habe viele Blogs gelesen, aber diese 2 Hauptfragen sind mir etwas unklar. Ich würde wirklich einen Beispielcode schätzen, wie ich meine Lösung erreichen und strukturieren kann.

Vielen Dank

Antwort

0

Sie verwenden den Zero Thread Scheduler, um Jobs zu planen. Beispiel Scheduler Initialisierungscode:

var properties = new NameValueCollection(); 
properties["quartz.scheduler.instanceId"] = "AUTO"; 
properties["quartz.threadPool.type"] = "Quartz.Simpl.ZeroSizeThreadPool, Quartz"; 
properties["quartz.jobStore.type"] = "Quartz.Impl.AdoJobStore.JobStoreTX, Quartz"; 
properties["quartz.jobStore.driverDelegateType"] = "Quartz.Impl.AdoJobStore.SqlServerDelegate, Quartz"; 
properties["quartz.jobStore.useProperties"] = "true"; 
properties["quartz.jobStore.dataSource"] = "default"; 
properties["quartz.jobStore.tablePrefix"] = tablePrefix; 
properties["quartz.jobStore.clustered"] = "false"; 
properties["quartz.dataSource.default.connectionString"] = connectionString; 
properties["quartz.dataSource.default.provider"] = "SqlServer-20"; 
schedFactory = new StdSchedulerFactory(properties); 
BaseScheduler = schedFactory.GetScheduler(); 

Beispiel Scheduling-Funktion:

protected ITrigger CreateSimpleTrigger(string tName, string tGroup, IJobDetail jd, DateTime startTimeUtc, 
     DateTime? endTimeUtc, int repeatCount, TimeSpan repeatInterval, Dictionary<string, string> dataMap, 
     string description = "") 
    { 
     if (BaseScheduler.GetTrigger(new TriggerKey(tName, tGroup)) != null) return null; 

     var st = TriggerBuilder.Create(). 
      WithIdentity(tName, tGroup). 
      UsingJobData(new JobDataMap(dataMap)). 
      StartAt(startTimeUtc). 
      EndAt(endTimeUtc). 
      WithSimpleSchedule(x => x.WithInterval(repeatInterval).WithRepeatCount(repeatCount)). 
      WithDescription(description). 
      ForJob(jd). 
      Build();    
     return st; 
    } 

Offensichtlich müssen Sie alle relevanten Felder in der Benutzeroberfläche bieten und Werte aus diesen Feldern in die Funktion übergeben. Beispiel-Screenshot von einigen der erforderlichen Felder:

Sample scheduling UI

Ihr Windows-Dienst wird in OnStart() -Methode in einer sehr ähnlichen Weise, wie ein Multi Thread-Scheduler initialisieren, dass Zero-Thread-Scheduler wurde oben und das Multi initialisiert Thread Scheduler überwacht alle Trigger in Ihrer Datenbank und startet Ihre Jobs wie in diesen Triggern angegeben. Quartz.net wird in dieser Hinsicht alles schwer machen. Sobald Sie Ihre Jobs geplant haben und die Trigger in der Datenbank sind, müssen Sie nur diesen Multi Thread Scheduler initialisieren, ihn mit der Datenbank verbinden, die Trigger enthält, und diese Jobs weiter ausführen und Ihren Code ausführen, solange der Service läuft.

+0

Danke Dean. Es tut uns leid, dass wir in eine andere Zeitzone gereist sind, also etwas verspätet. Die Lösung macht Sinn. Aus meiner WPF-Anwendung heraus erstelle ich einfach die Jobdetails und Triggerdetails und rufe ScheduleJob im Scheduler auf, der den Job speichern und Details in meinen Quartz-Datenbanktabellen auslösen soll. Und dann vom Windows-Dienst bekomme ich den Scheduler und rufe die Scheduler.Start-Methode auf, um sie Jobs auszuführen. Recht? – Maverick0208

+0

Korrekt, sobald Sie Ihren Scheduler initialisieren und Start() aufrufen, wird er Ihre DB überwachen und alle geplanten Jobs ausführen ... –

+0

Nochmals vielen Dank. – Maverick0208