在 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 方法是 运行。