我在Windows服务中使用Quartz.Net来处理我将要运行的各种作业的调度。这些作业位于数据库内部,每个作业都由一个单独的类库中的工厂方法处理。
我想阻止调度程序一次运行一个以上的作业,但我无法使用[DisallowConcurrentExecution]
属性,因为我只有一个IJob
scheduler - 我在单独的库中的工厂方法处理决定运行什么作业。</ p>
以下是我的单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 :(得分:1)
您可以在单个IJob实例上应用[DisallowConcurrentExecution]属性。我的意思是那个有Execute
方法的人。当您同步执行创建的作业时,您只需确保一次只运行一个`Execute方法。