在quartz.net中调度并发作业

时间:2015-05-19 13:14:37

标签: asp.net sql-server cron quartz.net web-application-project

我需要一些帮助。我试图弄清楚如何使用quartz.net安排依赖的作业,并尝试避免冲突,因为我正在使用连接到数据库。 我有一个包含3个类的Web应用程序:DownloadJob,UploadJob,Table1-Table2Job。 DownloadJob 每天凌晨4点将项目从mysql数据库下载到Sql数据库。 UploadJob 每4分钟从sql表(Table2)执行一次更新查询到mysql数据库。 Table1-Table2Job 负责每20分钟将项目从sql表传输到另一个sql表。

最大的问题是如何处理连接冲突。 如果Table1-Table2Job正在进行中,则UploadJob必须等待。然后继续 由于Table1-Table2Job必须等待UploadJob正在进行中。 必须始终下载。

我创建了一个Scheduler Class愿望代码是:

public class JobScheduler
{


    public static void Start()
    {
        Ul1_Ul2dbJob classU1_U2Job = new Ul1_Ul2dbJob();
        UploadJob classUpJob = new UploadJob();
        IScheduler schedulerDownload = StdSchedulerFactory.GetDefaultScheduler();

        IScheduler schedulerUl1_Ul2 = StdSchedulerFactory.GetDefaultScheduler();
        //schedulerUl1_Ul2.Start();
        IScheduler schedulerUpload = StdSchedulerFactory.GetDefaultScheduler();
        //schedulerUpload.Start();


        IJobDetail jobDown = JobBuilder.Create<DownloadJob>().Build();
        IJobDetail jobUpl = JobBuilder.Create<UploadJob>().Build();
        IJobDetail jobUl1_Ul2 = JobBuilder.Create<Ul1_Ul2dbJob>().Build();

        //Trigger di Download
        ITrigger trigger = TriggerBuilder.Create()
            .WithDailyTimeIntervalSchedule
              (s =>
                 s.WithIntervalInHours(24)
                .OnEveryDay()
                .StartingDailyAt(TimeOfDay.HourAndMinuteOfDay(03, 00))
              )
            .Build();
        //       ITrigger trigger =   TriggerBuilder.Create()
        //.WithCronSchedule(string.Format(cronFormat))
        //.Build();

        //trigger dei Upload
        ITrigger trigger1 = TriggerBuilder.Create()
           .WithCronSchedule("0 0/1 * * * ?")
           .StartNow()
           .WithPriority(1)
           .Build();
        //trigger per spostamento UL1 a UL2
        ITrigger trigger2 = TriggerBuilder.Create()
           .WithCronSchedule("0 0/1 * * * ?")
           .StartNow()
           .WithPriority(1)
           .Build();
        schedulerUpload.Start();
        schedulerUl1_Ul2.Start();
        schedulerUpload.ScheduleJob(jobUpl, trigger1);
        schedulerUl1_Ul2.ScheduleJob(jobUl1_Ul2, trigger2);
        //schedulerUpload.ScheduleJob(jobUl1_Ul2, trigger2);




        //// scheduling with use of function Lock()
        lock (schedulerDownload)
        {
            schedulerDownload.Start();
            schedulerDownload.ScheduleJob(jobDown, trigger);
        }
    }**

有人可以帮助我吗?

2 个答案:

答案 0 :(得分:1)

您可以定义一个不允许并发执行的作业(使用DisallowConcurrentExecution属性)。您将在数据映射中有一个参数来告诉您它是否用于在表之间上载或传输。然后你每4分钟安排一个上传参数的作业,每隔20分钟安排一次转移。石英将确保不同时执行它们,所以你不必自己动手。

答案 1 :(得分:0)

您可以致电GetCurrentlyExecutingJobs()查看正在运行的作业。但是,此方法不支持群集,因此无法查看其他调度程序调度的作业。如果您使用相同的计划程序安排所有作业,这是最好的。

假设您这样做,您可以从UploadJobTable1-Table2Job

执行以下操作
    public void Execute(IJobExecutionContext context)
    {
        var jobKey = new JobKey("otherJob", "group1"); 

        while (IsOtherJobRunning(context.Scheduler, jobKey)) // if job is running
        {
            Thread.Sleep(60000); // sleep for one minute
        }

        // continue with task.
    }

    /// <summary>
    /// Checks whether a job with the supplied job key is current running
    /// </summary>
    /// <returns>true/false</returns>
    public bool IsOtherJobRunning(IScheduler scheduler, JobKey key)
    {
        var jobs = scheduler.GetCurrentlyExecutingJobs();

        foreach (var job in jobs)
        {
            if (job.JobDetail.Key.Name == key.Name)
            {
                return true;
            }
        }

        return false;
    }