2017-07-14 3 views
1

Windowsサービス内でQuartz.Netを使用して、実行するさまざまなジョブのスケジューリングを処理しています。これらのジョブはデータベース内に存在し、各ジョブは別のクラスライブラリ内のファクトリメソッドによって処理されます。Quartz.netでは、単一のIJobを使用して同時にジョブが実行されないようにしますか?

私は唯一のスケジューラにおける単一IJobを持っているのでしかし、私は[DisallowConcurrentExecution]属性を使用することはできません、一度に私の仕事の1以上を実行しているから、スケジューラを防ぎたい - 別のライブラリの私のファクトリメソッド実行するジョブの決定を処理します。

以下は私の単一IJobです:

この中
public void Execute(IJobExecutionContext context) 
    { 
     JobDataMap dataMap = context.JobDetail.JobDataMap; 
     int jobId = dataMap.GetInt("JobId"); 
     logger.InfoFormat("Job {0} has been triggered.", jobId); 

     //Create a new Job Instance 
     JobInstance jobInstance = new JobInstance() 
     { 
      CreateDate = DateTime.UtcNow, 
      ExecutionState = ExecutionState.Running, 
      CreateSource = "Agent Scheduler Service", 
      Job = new Job() { Id = jobId } 
     }; 

     middlewareRepository.CreateJobInstance(jobInstance); 
     var job = jobFactory.GetJobImplementation(jobInstance); 

     //execute the job 
     job.Execute(); 
     logger.InfoFormat("Job {0} has been executed.", jobId); 
    } 

は、私が唯一の任意の時点で実行するように単一のインスタンスを許可する私の仕事のための私のキーであるjobIdあります。

これは私が仕事をロードする方法である:

protected void LoadJobs() 
{ 
    logger.Info("Loading jobs."); 
    var jobs = middlewareRepository.GeActiveJobs(); 

    foreach (var job in jobs) 
    { 
     IJobDetail jobDetail = JobBuilder.Create<JobDespatcher>() 
      .WithIdentity(job.Description) 
      .UsingJobData("JobId", job.Id) 
      .Build(); 

     ITrigger trigger = TriggerBuilder.Create() 
      .WithCronSchedule(job.CronExpression) 
      .Build(); 

     scheduler.ScheduleJob(jobDetail, trigger); 
     logger.InfoFormat("Job with id {0} ({1}) has been scheduled.", job.Id, job.Description); 
    } 
} 

は、キーまたはデータの一部に基づいて二回実行されているから、同じ仕事を防ぐためにQuartz.net内の方法はありますか?

+0

あなたは.netでロックを行う方法に精通していますか?そうでなければ、それを調べたいと思うように思えます。 lockキーワード(https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/lock-statement)を使用すると、囲まれたコードのビットを一度に1つずつ入力することができます必要に応じて他の人が出るまで待ちます)。 Monitor.TryEnter(https://msdn.microsoft.com/en-us/library/system.threading.monitor.tryenter(v=vs.110).aspx)は、他の誰かが既にコードを実行している場合、そのコードの実行をスキップできますそれを実行している... – Chris

+0

あなたは、quartz.netスレッドプールのスレッド数を1に設定しようとするかもしれません。web.configファイルで、quartzセクションの次に追加してください: ' ' – Set

+0

@Setこれは、すべてのジョブが同時に実行されるのを防ぎます。私はできるだけ多くのIJobsをIJobの中で実行したいと思います。私は "Job Group"を持っていて、一度にジョブグループの1つのタイプのジョブしか実行したくない場合は – Lock

答えて

0

[DisallowConcurrentExecution]属性は、単一のIJobインスタンスに適用できます。私は1つ、それ以上の方法を持っていることを意味しますExecute方法。作成されたジョブを同期して実行するには、一度に1つの `Executeメソッドが実行されていることを確認すれば十分です。

+0

しかし、2つの異なるジョブが同時に実行されます – doker

関連する問題