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

时间:2017-07-14 09:13:56

标签: c# quartz.net

我在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中是否有办法防止同一个作业根据一个键或一个数据运行两次?

1 个答案:

答案 0 :(得分:1)

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