2011-07-20 9 views
5

私は助けが必要です。私はQuartz.Netでジョブをスケジュールする方法を理解しようとしています。 Quartzのジョブは、Webアプリケーション内のタスクに対応します。これらのタスクは、Webアプリケーション内の各ジョブの一部です。私は、ユーザーが必要に応じてジョブ(WebApplication Context)を立ち上げ、即座に実行したり、将来的にジョブをスケジューリングしたり、一定の間隔で繰り返してもらいたいと考えています。私はこれらのすべてのアイテムが個別にQuartzでどのように達成されているかを知っていますが、すべてをまとめておくのは苦労しています。Quartz.Netの従属ジョブのスケジューリング

たとえば、私のWebアプリケーションでは、特定の順序でいくつかのタスクを持つジョブがある可能性があります。これらのタスクをクォーツでスケジュールして、Webアプリケーションで決定された順序と同じ順序で実行できるようにしたいと考えています。誰もこれを行う方法のアイデアを持っていますか?私はQuartzドキュメントを読んで、次のJobをJobDataMapに保存するように言っています。ちょうどそれに苦労しています。

私は現在、ユーザがジョブをスケジュールするか、実行するまでクォーツジョブを作成するのを待っています。ジョブを作成してWebアプリケーションでタスクを作成し、その情報をQuartzでスケジュールするためにタスクオブジェクトから取得する必要があると思いますか?

答えて

4

2番目の段落で:私が正しく理解していれば、ユーザーは一連のジョブを持っており、その中からユーザーは特定の実行順序を選択して置くことができます。私は、ユーザーが選択したすべてのジョブ・タイプのジョブ・インスタンスを作成してアプローチします。ジョブの順序を維持するために、次のジョブのグループ名とジョブ名を前のジョブのJobDataMapに格納することができます。次に、すべてのジョブに登録されているジェネリックJobListenerを持つことができます。リスナーはジョブの実行時に通知を受け、ジョブバンドルを引数として渡します。 JobListenerは、実行されたばかりのジョブのJobDataMapを列挙できます。キー "nextjobname"を持つキーと値のペアが見つかると、JobListenerはスケジューラにこのジョブを照会します。ジョブバンドルでも使用可能なスケジューラへの参照。スケジューラが指定された名前のJobDetailのインスタンスを返す場合、JobListenerはJobDataMap内の "nextjobname"を持つジョブに到達するまで、JobListenerを実行し、完了したら通知を返します。
また、ジョブリスナーを使用したくない場合は、この機能を実装する基本ジョブクラスを設定することができます。ジョブはすべてこのクラスから派生し、仮想Executeメソッドをオーバーライドします。オーバーライドされた実装が返る直前にbase.Execute(context)を呼び出すことができます。あなたが必要なもの

public class Basejob : IJob 
{ 
    public virtual void Execute(JobExecutionContext context) 
    { 
     string nextJob = context.MergedJobDataMap["nextjobname"]; 
     JobDetail nextjob = context.Scheduler.GetJobDetail(context.MergedJobDataMap["nextjobname"], 
              context.MergedJobDataMap["nextjobgroupname"]); 
     if(nextjob != null) 
     { 
      context.Scheduler.ScheduleJob(nextjob, new SimpleTrigger(nextjob.Name + "trigger")); // this will fire the job immediately 
     } 
    } 
} 

public class MyJob : BaseJob 
{ 
    public override void Execute(JobExecutionContext context) 
    { 
     //do work 
     base.Execute(context); 
    } 
} 
+0

...です。 JobListenerまたはベースのJobクラスの例はありますか? – M4V3R1CK

+0

別の簡単な質問:リスナーを介して実行されるジョブにトリガーを割り当てる方法を教えてください。私の理解から、仕事をスケジュールするには、(それに関連付けられた仕事で)トリガーだけを通すか、トリガーと仕事を渡す必要があります。 – M4V3R1CK

+0

誰かが不思議に思っていた場合は、_scheduler.AddJob(JobDetailジョブ、bool Replace)を使用すると、関連付けられたトリガーなしでデータストアにジョブを追加できます... – M4V3R1CK

10

は、あなたが望む特定の順序であなたのジョブの実行のチェーンを作成するのに役立つためにそこにあるJobChainingJobListenerクラスは、これは理にかなって

using System; 
using System.Text; 
using Quartz; 
using Quartz.Impl; 
using Quartz.Impl.Calendar; 
using Quartz.Listener; 
using Quartz.Impl.Matchers; 
using System.Threading; 

namespace QuartzNET.Samples 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      // Create RAMJobStore instance 
      DirectSchedulerFactory.Instance.CreateVolatileScheduler(5); 
      ISchedulerFactory factory = DirectSchedulerFactory.Instance; 

      // Get scheduler and add object 
      IScheduler scheduler = factory.GetScheduler();   

      StringBuilder history = new StringBuilder("Runtime History: "); 
      scheduler.Context.Add("History", history); 

      JobKey firstJobKey = JobKey.Create("FirstJob", "Pipeline"); 
      JobKey secondJobKey = JobKey.Create("SecondJob", "Pipeline"); 
      JobKey thirdJobKey = JobKey.Create("ThirdJob", "Pipeline"); 

      // Create job and trigger 
      IJobDetail firstJob = JobBuilder.Create<FirstJob>() 
             .WithIdentity(firstJobKey) 
             //.StoreDurably(true) 
             .Build(); 

      IJobDetail secondJob = JobBuilder.Create<SecondJob>() 
             .WithIdentity(secondJobKey)          
             .StoreDurably(true)          
             .Build(); 

      IJobDetail thirdJob = JobBuilder.Create<ThirdJob>() 
             .WithIdentity(thirdJobKey) 
             .StoreDurably(true) 
             .Build(); 

      ITrigger firstJobTrigger = TriggerBuilder.Create() 
              .WithIdentity("Trigger", "Pipeline") 
              .WithSimpleSchedule(x => x 
               .WithMisfireHandlingInstructionFireNow() 
               .WithIntervalInSeconds(5)  
               .RepeatForever()) 
              .Build(); 

      JobChainingJobListener listener = new JobChainingJobListener("Pipeline Chain"); 
      listener.AddJobChainLink(firstJobKey, secondJobKey); 
      listener.AddJobChainLink(secondJobKey, thirdJobKey);    

      scheduler.ListenerManager.AddJobListener(listener, GroupMatcher<JobKey>.GroupEquals("Pipeline")); 

      // Run it all in chain 
      scheduler.Start(); 
      scheduler.ScheduleJob(firstJob, firstJobTrigger); 
      scheduler.AddJob(secondJob, false, true); 
      scheduler.AddJob(thirdJob, false, true); 

      Console.ReadLine(); 
      scheduler.Shutdown(); 
      Console.WriteLine("Scheduler shutdown."); 
      Console.WriteLine(history); 
      Console.ReadLine(); 
     } 
    } 

    class FirstJob : IJob 
    { 
     public void Execute(IJobExecutionContext context) 
     { 
      var history = context.Scheduler.Context["History"] as StringBuilder; 
      history.AppendLine(); 
      history.AppendFormat("First {0}", DateTime.Now);    
      Console.WriteLine("First {0}", DateTime.Now); 
     } 
    } 

    class SecondJob : IJob 
    { 
     public void Execute(IJobExecutionContext context) 
     { 
      var history = context.Scheduler.Context["History"] as StringBuilder; 
      history.AppendLine(); 
      history.AppendFormat("Second {0}", DateTime.Now); 
      Console.WriteLine("Second {0}", DateTime.Now);    
     } 
    } 

    class ThirdJob : IJob 
    { 
     public void Execute(IJobExecutionContext context) 
     { 
      var history = context.Scheduler.Context["History"] as StringBuilder; 
      history.AppendLine(); 
      history.AppendFormat("Third {0}", DateTime.Now); 
      Console.WriteLine("Third {0}", DateTime.Now); 
      Console.WriteLine(); 
     } 
    } 
} 
関連する問題