public void TestChange_Job_AddNewWithoutTriggers()
        {
            DoWithData((session, provider) =>
            {
                // берем дату проверки
                var checkDate = DateTime.Now;

                // засыпаем на 2 секунды, чтобы детектить изменения
                Thread.Sleep(TimeSpan.FromSeconds(2));

                // у Job1 добавляем job без триггера
                var job1   = session.Query <SchJob>().Single(i => i.Code == "TST_JOB1");
                var newJob = new SchJob
                {
                    Code      = "TST_NEWJOB",
                    JobType   = job1.JobType,
                    Scheduler = job1.Scheduler
                };
                session.Save(newJob);

                session.Flush();

                // поехали
                JobKey[] deletedJobs;
                IDictionary <IJobDetail, Quartz.Collection.ISet <ITrigger> > changedJobs;

                provider.GetChangedJobs(TstSchedulerName, checkDate, out deletedJobs, out changedJobs);

                // 1 job будет, т.к. мы не знаем что именно произошло: у старого удалили trigger или добавили job без триггера
                deletedJobs.Should().HaveCount(1);
                changedJobs.Should().HaveCount(0);
            });
        }
        public void TestChange_Job_AddNew()
        {
            DoWithData((session, provider) =>
            {
                // берем дату проверки
                var checkDate = DateTime.Now;

                // засыпаем на 2 секунды, чтобы детектить изменения
                Thread.Sleep(TimeSpan.FromSeconds(2));

                // у Job1 добавляем новый параметр
                var job1   = session.Query <SchJob>().Single(i => i.Code == "TST_JOB1");
                var newJob = new SchJob
                {
                    Code      = "TST_NEWJOB",
                    JobType   = job1.JobType,
                    Scheduler = job1.Scheduler
                };
                session.Save(newJob);
                var jobNewTrigger1 = new SchCronTrigger
                {
                    Code           = "TST_JOBNEW_TR1",
                    Scheduler      = job1.Scheduler,
                    StartTimeUtc   = DateTime.UtcNow.AddDays(-1),
                    Job            = newJob,
                    CronExpression = SampleCronExpression
                };
                session.Save(jobNewTrigger1);
                newJob.Job_SchTrigger_List.Add(jobNewTrigger1);

                session.Flush();

                // поехали
                JobKey[] deletedJobs;
                IDictionary <IJobDetail, Quartz.Collection.ISet <ITrigger> > changedJobs;

                provider.GetChangedJobs(TstSchedulerName, checkDate, out deletedJobs, out changedJobs);

                // проверяем
                deletedJobs.Should().HaveCount(0);
                changedJobs.Should().HaveCount(1);
                changedJobs.Keys.Single().Key.Name.ShouldBeEquivalentTo(newJob.Code);
                changedJobs.Values.Single().Should().HaveCount(1);
                changedJobs.Values.Single().Single().Key.Name.ShouldBeEquivalentTo(jobNewTrigger1.Code);
            });
        }
 private static bool AddJob(SchJob job, Dictionary <IJobDetail, Quartz.Collection.ISet <ITrigger> > targetCollection)
 {
     try
     {
         var jobDetail = BuildJobDetail(job);
         var triggers  = BuildTriggers(job);
         if (triggers.Any())
         {
             targetCollection.Add(jobDetail, triggers);
             return(true);
         }
     }
     catch (Exception ex)
     {
         Log.Error(string.Format("Ошибка подготовки задания. Задание '{0}' не будет запланировано. {1}", job == null ? string.Empty : job.Code, ex.Message), ex);
     }
     return(false);
 }
        private static IJobDetail BuildJobDetail(SchJob job)
        {
            if (job == null)
            {
                throw new ArgumentNullException("job");
            }

            var jobType = Type.GetType(job.JobType.ClassName);

            if (jobType == null)
            {
                throw new InvalidOperationException(string.Format("Не удалось найти задание с именем реализатора '{0}'.", job.JobType.ClassName));
            }

            return(new JobDetailImpl(job.Code, job.JobGroup, jobType)
            {
                Description = job.Description,
                JobDataMap = new JobDataMap(job.Job_SchJobParam_List.ToDictionary(i => i.Name, p => p.Value))
            });
        }
        private static Quartz.Collection.ISet <ITrigger> BuildTriggers(SchJob job)
        {
            var utcDate = DateTime.UtcNow;
            var res     = new Quartz.Collection.HashSet <ITrigger>();

            foreach (var trigger in job.Job_SchTrigger_List)
            {
                if (trigger.Disabled == true)
                {
                    continue;
                }

                if (utcDate < trigger.StartTimeUtc || trigger.EndTimeUtc <= utcDate)
                {
                    continue;
                }

                res.Add(BuildTrigger(trigger));
            }
            return(res);
        }
        /// <summary>
        /// Сценарий:
        /// Job1 - нормальный
        /// Job2 - имеет один триггер с датой старта больше текущей
        /// Job3 - имеет один триггер с датой окончания меньше текущей
        /// Job4 - имеет один заблокированный триггер
        /// Job5 - имеет два триггера: один заблокирован, один нормальный
        /// </summary>
        /// <param name="session"></param>
        private static void PopulateTestData(ISession session)
        {
            var scheduler = new SchScheduler {
                Code = TstSchedulerName
            };

            session.Save(scheduler);

            var jobType = new SchJobType
            {
                Code      = "TST Job Type",
                ClassName = string.Format("{0}, MLC.Wms.Scheduler.Tests", typeof(FakeJob).FullName),
                Scheduler = scheduler
            };

            session.Save(jobType);

            var job1 = new SchJob
            {
                JobType   = jobType,
                Code      = "TST_JOB1",
                Scheduler = scheduler
            };

            session.Save(job1);

            var job1Param1 = new SchJobParam
            {
                Name  = "TST_JOB1_PARAM1",
                Job   = job1,
                Value = "TST VALUE"
            };

            session.Save(job1Param1);
            job1.Job_SchJobParam_List.Add(job1Param1);

            var job1Trigger1 = new SchCronTrigger
            {
                Code               = "TST_JOB1_TR1",
                CronExpression     = SampleCronExpression,
                MisfireInstruction = 1,
                StartTimeUtc       = DateTime.UtcNow.AddDays(-1),
                Job       = job1,
                Scheduler = scheduler
            };

            session.Save(job1Trigger1);
            job1.Job_SchTrigger_List.Add(job1Trigger1);

            // job 2
            var job2 = new SchJob
            {
                JobType   = jobType,
                Code      = "TST_JOB2",
                Scheduler = scheduler
            };

            session.Save(job2);
            var job2Trigger1 = new SchCronTrigger
            {
                Code               = "TST_JOB2_TR1",
                CronExpression     = SampleCronExpression,
                MisfireInstruction = 1,
                StartTimeUtc       = DateTime.UtcNow.AddDays(1),
                Job       = job2,
                Scheduler = scheduler
            };

            session.Save(job2Trigger1);
            job2.Job_SchTrigger_List.Add(job2Trigger1);

            // job 3
            var job3 = new SchJob
            {
                JobType   = jobType,
                Code      = "TST_JOB3",
                Scheduler = scheduler
            };

            session.Save(job3);
            var job3Trigger1 = new SchCronTrigger
            {
                Code               = "TST_JOB3_TR1",
                CronExpression     = SampleCronExpression,
                MisfireInstruction = 1,
                StartTimeUtc       = DateTime.UtcNow.AddDays(-2),
                EndTimeUtc         = DateTime.UtcNow.AddDays(-1),
                Job       = job3,
                Scheduler = scheduler
            };

            session.Save(job3Trigger1);
            job3.Job_SchTrigger_List.Add(job3Trigger1);

            // job 4
            var job4 = new SchJob
            {
                JobType   = jobType,
                Code      = "TST_JOB4",
                Scheduler = scheduler
            };

            session.Save(job4);
            var job4Trigger1 = new SchCronTrigger
            {
                Code               = "TST_JOB4_TR1",
                CronExpression     = SampleCronExpression,
                MisfireInstruction = 1,
                StartTimeUtc       = DateTime.UtcNow.AddDays(-2),
                EndTimeUtc         = DateTime.UtcNow.AddDays(+1),
                Disabled           = true,
                Job       = job4,
                Scheduler = scheduler
            };

            session.Save(job4Trigger1);
            job4.Job_SchTrigger_List.Add(job4Trigger1);

            // job 5
            var job5 = new SchJob
            {
                JobType   = jobType,
                Code      = "TST_JOB5",
                Scheduler = scheduler
            };

            session.Save(job5);
            var job5Trigger1 = new SchCronTrigger
            {
                Code               = "TST_JOB5_TR1",
                CronExpression     = SampleCronExpression,
                MisfireInstruction = 1,
                StartTimeUtc       = DateTime.UtcNow.AddDays(-2),
                EndTimeUtc         = DateTime.UtcNow.AddDays(+1),
                Disabled           = true,
                Job       = job5,
                Scheduler = scheduler
            };

            session.Save(job5Trigger1);
            job5.Job_SchTrigger_List.Add(job5Trigger1);

            var job5Trigger2 = new SchCronTrigger
            {
                Code               = "TST_JOB5_TR2",
                CronExpression     = SampleCronExpression,
                MisfireInstruction = 1,
                StartTimeUtc       = DateTime.UtcNow.AddDays(-2),
                EndTimeUtc         = DateTime.UtcNow.AddDays(+1),
                Job       = job5,
                Scheduler = scheduler
            };

            session.Save(job5Trigger2);
            job5.Job_SchTrigger_List.Add(job5Trigger2);
        }