在 Quartz.net 中,如何在使用单个 IJob 时同时阻止作业 运行?
In Quartz.net, how do I prevent a job running concurrently when using a single IJob?
我在 Windows 服务中使用 Quartz.Net 来处理我将要 运行 进行的各种作业的调度。这些作业存在于数据库中,每个作业都由单独的 class 库中的工厂方法处理。
我想防止调度器一次 运行 处理我的多个作业,但是我不能使用 [DisallowConcurrentExecution]
属性,因为我只有一个 IJob
在调度程序中 - 我在一个单独的库中的工厂方法处理决定 运行.
下面是我的单曲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 中有没有一种方法可以防止同一个作业根据一个键或一条数据 运行ning 两次?
您可以在单个 IJob 实例上应用 [DisallowConcurrentExecution] 属性。我的意思是那个有上面的 Execute
方法。当您同步执行创建的作业时,您只需确保一次只有一个 `Execute 方法是 运行。
我在 Windows 服务中使用 Quartz.Net 来处理我将要 运行 进行的各种作业的调度。这些作业存在于数据库中,每个作业都由单独的 class 库中的工厂方法处理。
我想防止调度器一次 运行 处理我的多个作业,但是我不能使用 [DisallowConcurrentExecution]
属性,因为我只有一个 IJob
在调度程序中 - 我在一个单独的库中的工厂方法处理决定 运行.
下面是我的单曲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 中有没有一种方法可以防止同一个作业根据一个键或一条数据 运行ning 两次?
您可以在单个 IJob 实例上应用 [DisallowConcurrentExecution] 属性。我的意思是那个有上面的 Execute
方法。当您同步执行创建的作业时,您只需确保一次只有一个 `Execute 方法是 运行。