gpt4 book ai didi

c# - 在 Quartz.net 中,如何在使用单个 IJob 时防止作业同时运行?

转载 作者:太空宇宙 更新时间:2023-11-03 12:25:50 25 4
gpt4 key购买 nike

我在 Windows 服务中使用 Quartz.Net 来处理我将要运行的各种作业的调度。这些作业存在于数据库中,每个作业都由单独类库中的工厂方法处理。

我想防止调度程序一次运行超过 1 个作业,但是我不能使用 [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 中有没有一种方法可以防止同一个作业根据一个键或一段数据运行两次?

最佳答案

您可以在单个 IJob 实例上应用 [DisallowConcurrentExecution] 属性。我的意思是那个有上面的 Execute 方法。当您同步执行创建的作业时,您只需确保一次只有一个 `Execute 方法在运行。

关于c# - 在 Quartz.net 中,如何在使用单个 IJob 时防止作业同时运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45099106/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com