4

Quartz 公式ドキュメントから理解したように、AdoStore は JobDataMap やその他のデータのようなアクティブなデータ格納に使用する必要があります。私が間違っている場合は修正してください。

この明確化に加えて、データベースからジョブとトリガーの定義をロードする方法があることを知りたいです。プラグインのようなものQuartz.Plugin.Xml.XMLSchedulingDataProcessorPluginは、xml ファイルから読み取るためのものです。

そうでない場合、データベースから読み取るカスタムプラグインを実装するか、他のアプローチを使用するのが最善の解決策ですか?

[編集] Rastko 8/13/2012 11:16:28 AM

以下の回答から、問題をうまく説明していないと思います。データベースからジョブとトリガーの設定をロードしたいと思います。コードまたはxmlで次のように定義されているように:

    <job>
  <name>WriterJob</name>
  <group>CommonGroup</group>
  <description>Test WriteJob</description>
  <job-type>Console.WriteJob, Console</job-type>
</job>
<trigger>
  <simple>
    <name>WriterJobTrigger</name>
    <group>CommonTriggerGroup</group>
    <description>Simple trigger to simply fire sample job</description>
    <job-name>WriterJob</job-name>
    <job-group>CommonGroup</job-group>
    <misfire-instruction>SmartPolicy</misfire-instruction>
    <repeat-count>-1</repeat-count>
    <repeat-interval>10000</repeat-interval>
  </simple>
</trigger>

これをDataBaseでも同じようにしたいです。ADOJobStore 用に生成されたテーブルから、これらのテーブルは、現在アクティブなジョブの追跡 (状態の追跡、トリガーの起動など) により関連していることがわかります。

今はもっとはっきりしていることを願っています。追加の説明が必要な場合は、お気軽にお問い合わせください。

4

3 に答える 3

13

データベースからジョブとトリガーの定義をロードする方法があることを知りたいです。

データベースからジョブのリストを取得する場合は、次のようにすることができます。

  Quartz.IScheduler scheduler ; 


   ....

  var details = (from groupName in scheduler.GetJobGroupNames()
                 from jobKey in scheduler.GetJobKeys(
                      Quartz.Impl.Matchers.GroupMatcher<Quartz.JobKey>
                      .GroupEquals(groupName))
                select new 
                { 
                    GroupName = groupName, 
                    JobName = jobKey.Name  , 
                    triggers = scheduler.GetTriggersOfJob(jobKey) 
                }
               );

この構文は Quartz 2.0 用です。

実際にジョブを実行しているプログラムとは別のプログラムを構築している場合は、同じ詳細でスケジューラを作成するだけで、scheduler.Start() を呼び出さないでください。

データベースに新しいジョブを追加する場合は、次のようなことができます。

(ここで、SimpleJob はジョブの C# クラス名です)

string jobName = ...
string triggerName = ...
string cronExpression = ...  
Quartz.IScheduler scheduler = ... 


Quartz.IJobDetail jobDetail = Quartz.JobBuilder.Create<SimpleJob>()
                    .WithIdentity(jobName)
                    .StoreDurably()
                    .Build();
                    
Quartz.ITrigger trigger = Quartz.TriggerBuilder.Create()
                    .WithIdentity(triggerName)
                    .WithSchedule(Quartz.CronScheduleBuilder.CronSchedule(cronExpression))
                    .ForJob(jobName)
                    .Build();
            
scheduler.ScheduleJob(jobDetail, trigger);

トリガーをアタッチせずにジョブをデータベースに追加する場合

Quartz.IJobDetail jobDetail = Quartz.JobBuilder.Create<SimpleJob>()
                    .WithIdentity(jobName)
                    .StoreDurably()
                    .Build();

scheduler.AddJob(jobDetail, false)

1 回限りの既存のジョブの実行をスケジュールする場合は、

   Quartz.ITrigger trigger1 = Quartz.TriggerBuilder.Create()
                        .WithIdentity(triggerName)
                        .WithSchedule(Quartz.SimpleScheduleBuilder.Create())
                        .ForJob(jobName)
                        .Build();

   scheduler.ScheduleJob(trigger1);
于 2012-08-11T20:14:03.770 に答える
0

XMLSchedulingDataProcessorPlugin の実装をご覧ください。基本的に、ISchedulerPlugin を実装し、ジョブをロードするためのロジックを追加する必要があります。

于 2015-01-29T13:36:19.970 に答える
0

私は Java に Quartz を使用していますが、基本的なロジックは同じであるため、タスク スケジューラに XML を使用することはお勧めできません。ジョブのステータスが変更されるたびに、xml ファイルを変更する必要があります。データベース (あなたの場合は AdoJobStore) を使用する方が効率的かもしれません。

于 2012-08-10T15:46:26.553 に答える