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内の方法はありますか?
あなたは.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
あなたは、quartz.netスレッドプールのスレッド数を1に設定しようとするかもしれません。web.configファイルで、quartzセクションの次に追加してください: ' ' –
Set
@Setこれは、すべてのジョブが同時に実行されるのを防ぎます。私はできるだけ多くのIJobsをIJobの中で実行したいと思います。私は "Job Group"を持っていて、一度にジョブグループの1つのタイプのジョブしか実行したくない場合は – Lock