2011-01-03 17 views
6

Quartz.Netが組み込まれたWindowsサービスがありますが、Quartz.Netジョブ内でインスタンス化されたオブジェクトへの参照を作成する方法が見つからないようです...Quartz.Netジョブ内でインスタンス化されたオブジェクトへの参照を作成する方法は?

Windowsサービスが開始されると、ロギング、データベースアクセスなどの目的のためにいくつかのオブジェクトを用意していますので、Quartz.Netジョブでこれらのオブジェクトの独自のインスタンスを作成する代わりに、既にインスタンス化されたこれらのオブジェクトを使用したいと思います。しかし、Quartz.Netジョブは、引数のないコンストラクタを使用してスケジューラによってインスタンス化されるため、コンストラクタを使用して参照を渡す方法はありません。

私は独自のJobFactoryの実装を作成する必要がありますか?それを達成する唯一の方法はありますか?

答えて

1

異なるコンテキスト(Linux/JAVA)ですが、Quartzのものを継承する独自のFactoryを作成してください。メソッド "createScheduler"をオーバーライドします。スーパーメソッドを呼び出し、インスタンスを静的な(同期した)ハッシュマップに保存します。インスタンスを名前で取得する静的メソッドを作成します。

2

オブジェクトのキーと値のペアをjobDetail.JobDataMapに追加し、from(JobExecutionContext) context.JobDetail.JobDataMapを取得できます。

+0

クォーツサイト「のみJobDataMapでは(文字列を含む)プリミティブデータ型を保存」と言う - http://www.quartz-scheduler.org/documentation/best-practices – TruthOf42

3

この状況では、job listenerを使用する方法が効果的だと思います。 何もしない「ダミー」ジョブと、ジョブがいつ実行されたかを検出するリスナーを作成できます。リスナーは、ジョブスケジューリングを設定した時点で利用可能である限り、依存関係の参照を使用してインスタンス化できます。

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

ないように私は、あなたに同意あなたのリンク「ジョブリスナー」が指すドキュメント。私はDeanとGoogleがここで私に送ったのと同じ問題を抱えていました。私は選択したソリューションよりもあなたのソリューションを好んで、適切に実装しました。 – roadkill

関連する問題