0

Мне нужна помощь. Я пытаюсь выяснить, как планировать зависимые задания с помощью quartz.net и пытаться избежать конфликтов, поскольку я использую соединение с базой данных. У меня есть веб-приложение с 3 классами: DownloadJob, UploadJob, Table1-Table2Job. DownloadJob загружает элементы из mysql db в Sql db каждый день в 4 часа ночи. UploadJob выполнить запрос на обновление mysql db из таблицы sql (Таблица 2) каждые 4 мин. Таблица1-Table2Job несет ответственность за перенос предметов из таблицы sql в другую таблицу sql каждые 20 мин.Планирование параллельных вакансий в quartz.net

Большая проблема заключается в том, как бороться с конфликтами соединения. UploadJob должен ждать, если Table1-Table2Job находится в процессе. и затем продолжайте. Как Table1-Table2Job должен ждать, если выполняется UploadJob. Загрузка всегда должна идти.

я должен создать планировщик код класса желание:

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); 
     } 
    }** 

Кто-то может мне помочь?

ответ

1

Вы можете определить работу, которая не разрешает одновременно расстрелы (с атрибутом DisallowConcurrentExecution). У вас будет параметр на карте данных, чтобы рассказать вам, загружается ли или переносится между таблицами. Затем вы планируете задание с параметром upload каждые 4 минуты и одно с передачей каждые 20. Кварц будет следить за тем, чтобы не выполнять их одновременно, поэтому вам не нужно делать это самостоятельно.

0

Вы можете проверить, какие вакансии выполняются, позвонив по номеру GetCurrentlyExecutingJobs(). Однако этот метод не известен кластерам, поэтому он не сможет видеть задания, запланированные другими планировщиками. Лучше всего, если вы планируете все свои задания, используя один и тот же планировщик.

Предполагая, что вы сделаете это, вы можете просто сделать следующее из UploadJob и Table1-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; 
    }