2011-01-03 8 views
6

Ich habe einen Windows-Dienst mit eingebetteten Quartz.Net, aber scheint nicht eine Möglichkeit zu finden, einen Verweis auf ein instanziiertes Objekt in einem Quartz.Net-Job zu erstellen ...Wie erstellt man einen Verweis auf ein instanziiertes Objekt innerhalb eines Quartz.Net-Jobs?

Wenn der Windows-Dienst gestartet wird, instanziiert es einige Objekte für die Protokollierung, den Datenbankzugriff und andere Zwecke, daher möchte ich, dass meine Quartz.Net-Jobs diese bereits instanziierten Objekte verwenden, anstatt eigene Instanzen dieser Objekte zu erstellen. Quartz.Net-Jobs werden jedoch vom Scheduler mit dem Konstruktor "no-argument" instanziiert, und daher gibt es keine Möglichkeit, einen Verweis mithilfe des Konstruktors zu übergeben.

Muss ich meine eigene Implementierung der JobFactory erstellen und ist dies der einzige Weg, dies zu erreichen?

Antwort

1

Unterschiedlicher Kontext (Linux/JAVA), aber erstellen Sie Ihre eigene Factory, die von der Quartz One erbt. Überschreiben Sie die Methode "createScheduler". Rufen Sie die Super-Methode auf und speichern Sie die Instanz in einer statischen (synchronisierten) Hash-Map. Schreibe eine statische Methode, um Instanz nach Name zu erhalten.

2

Sie können Schlüssel-Wert-Paare von Objekten in jobDetail.JobDataMap hinzufügen und sie from(JobExecutionContext) context.JobDetail.JobDataMap abrufen.

+0

die Quarz-Website sagt, „nur primitive Datentypen speichern (einschließlich Strings) Im JobDataMap“ - http://www.quartz-scheduler.org/documentation/best-practices – TruthOf42

3

Ich denke, der Ansatz, der für diese Situation funktioniert, ist ein job listener zu verwenden. Sie können einen "Dummy" -Auftrag erstellen, der nichts tut, und einen Listener, der erkennt, wenn der Job ausgeführt wurde. Sie können den Listener mit Verweisen auf Abhängigkeiten instanziieren, sofern sie zum Zeitpunkt der Einrichtung der Jobplanung verfügbar sind.

IJobDetail job = JobBuilder.Create<DummyJob>() 
      .WithIdentity("job1") 
      .Build(); 

     ITrigger trigger = TriggerBuilder.Create() 
      .WithIdentity("trigger1") 
      .StartNow() 
      .WithSimpleSchedule(x => x 
       .WithInterval(interval) 
       .RepeatForever()) 
      .Build(); 

     _scheduler.ScheduleJob(job, trigger); 

     MyJobListener myJobListener = new MyJobListener (dependency1, dependency2); 

     _scheduler.ListenerManager.AddJobListener(myJobListener, KeyMatcher<JobKey>.KeyEquals(new JobKey("job1"))); 
+0

Ich stimme Ihnen zu, genau wie die Dokumentation, auf die Ihr Link "Job Listener" zeigt. Ich hatte das gleiche Problem wie Dean und Google, die mich hierher geschickt haben - ich bevorzuge deine Lösung gegenüber der gewählten und habe sie entsprechend implementiert. – roadkill

Verwandte Themen