public void TestTriggerStates()
        {
            Trigger trigger =
                new SimpleTrigger("trigger1", "triggerGroup1", fJobDetail.Name, fJobDetail.Group,
                                  DateTime.Now.AddSeconds(100), DateTime.Now.AddSeconds(200), 2, TimeSpan.FromSeconds(2));

            trigger.ComputeFirstFireTimeUtc(null);
            Assert.AreEqual(TriggerState.None, fJobStore.GetTriggerState(null, trigger.Name, trigger.Group));
            fJobStore.StoreTrigger(null, trigger, false);
            Assert.AreEqual(TriggerState.Normal, fJobStore.GetTriggerState(null, trigger.Name, trigger.Group));

            fJobStore.PauseTrigger(null, trigger.Name, trigger.Group);
            Assert.AreEqual(TriggerState.Paused, fJobStore.GetTriggerState(null, trigger.Name, trigger.Group));

            fJobStore.ResumeTrigger(null, trigger.Name, trigger.Group);
            Assert.AreEqual(TriggerState.Normal, fJobStore.GetTriggerState(null, trigger.Name, trigger.Group));

            trigger = fJobStore.AcquireNextTrigger(null,
                                                   trigger.GetNextFireTimeUtc().Value.AddSeconds(10));
            Assert.IsNotNull(trigger);
            fJobStore.ReleaseAcquiredTrigger(null, trigger);
            trigger = fJobStore.AcquireNextTrigger(null,
                                                   trigger.GetNextFireTimeUtc().Value.AddSeconds(10));
            Assert.IsNotNull(trigger);
            Assert.IsNull(fJobStore.AcquireNextTrigger(null,
                                                       trigger.GetNextFireTimeUtc().Value.AddSeconds(10)));
        }
        public void TestAcquireNextTrigger()
        {
            DateTime d        = DateTime.UtcNow;
            Trigger  trigger1 =
                new SimpleTrigger("trigger1", "triggerGroup1", fJobDetail.Name,
                                  fJobDetail.Group, d.AddSeconds(200),
                                  d.AddSeconds(200), 2, TimeSpan.FromSeconds(2));
            Trigger trigger2 =
                new SimpleTrigger("trigger2", "triggerGroup1", fJobDetail.Name,
                                  fJobDetail.Group, d.AddSeconds(-100),
                                  d.AddSeconds(20), 2, TimeSpan.FromSeconds(2));
            Trigger trigger3 =
                new SimpleTrigger("trigger1", "triggerGroup2", fJobDetail.Name,
                                  fJobDetail.Group, d.AddSeconds(100),
                                  d.AddSeconds(200), 2, TimeSpan.FromSeconds(2));

            trigger1.ComputeFirstFireTimeUtc(null);
            trigger2.ComputeFirstFireTimeUtc(null);
            trigger3.ComputeFirstFireTimeUtc(null);
            fJobStore.StoreTrigger(null, trigger1, false);
            fJobStore.StoreTrigger(null, trigger2, false);
            fJobStore.StoreTrigger(null, trigger3, false);

            Trigger t = fJobStore.AcquireNextTrigger(null, d.AddMilliseconds(10));

            Assert.IsNull(t);
            Assert.AreEqual(
                trigger2,
                fJobStore.AcquireNextTrigger(null, trigger1.GetNextFireTimeUtc().Value.AddSeconds(10)));
            Assert.AreEqual(
                trigger3,
                fJobStore.AcquireNextTrigger(null, trigger1.GetNextFireTimeUtc().Value.AddSeconds(10)));
            Assert.AreEqual(
                trigger1,
                fJobStore.AcquireNextTrigger(null, trigger1.GetNextFireTimeUtc().Value.AddSeconds(10)));
            Assert.IsNull(
                fJobStore.AcquireNextTrigger(null, trigger1.GetNextFireTimeUtc().Value.AddSeconds(10)));

            // because of trigger2
            Assert.AreEqual(1, fSignaler.fMisfireCount);

            // release trigger3
            fJobStore.ReleaseAcquiredTrigger(null, trigger3);
            Assert.AreEqual(
                trigger3,
                fJobStore.AcquireNextTrigger(null, trigger1.GetNextFireTimeUtc().Value.AddSeconds(10)));
        }
        public void TestGetFireTimeAfter_WithCalendar()
        {
            DailyCalendar dailyCalendar = new DailyCalendar("1:20", "14:50");
            SimpleTrigger simpleTrigger = new SimpleTrigger();

            simpleTrigger.RepeatInterval = TimeSpan.FromMilliseconds(10);
            simpleTrigger.RepeatCount    = 1;
            DateTime neverFireTime = TriggerUtils.GetEvenMinuteDateBefore(dailyCalendar.GetTimeRangeStartingTimeUtc(DateTime.Now));

            simpleTrigger.StartTimeUtc = neverFireTime;

            simpleTrigger.ComputeFirstFireTimeUtc(dailyCalendar);
            NullableDateTime fireTimeAfter = simpleTrigger.GetNextFireTimeUtc();

            Assert.IsNull(fireTimeAfter);
        }
        public void TestUpdateAfterMisfire()
        {
            DateTime startTime = new DateTime(2005, 7, 5, 9, 0, 0);

            DateTime endTime = new DateTime(2005, 7, 5, 10, 0, 0);

            SimpleTrigger simpleTrigger = new SimpleTrigger();

            simpleTrigger.MisfireInstruction = MisfireInstruction.SimpleTrigger.RescheduleNowWithExistingRepeatCount;
            simpleTrigger.RepeatCount        = 5;
            simpleTrigger.StartTimeUtc       = startTime;
            simpleTrigger.EndTimeUtc         = endTime;

            simpleTrigger.UpdateAfterMisfire(null);
            Assert.AreEqual(startTime, simpleTrigger.StartTimeUtc);
            Assert.AreEqual(endTime, simpleTrigger.EndTimeUtc.Value);
            Assert.IsTrue(!simpleTrigger.GetNextFireTimeUtc().HasValue);
        }
Exemple #5
0
        public virtual void Run(bool inClearJobs, bool inScheduleJobs)
        {
            NameValueCollection properties = new NameValueCollection();

            properties["quartz.scheduler.instanceName"]    = "TestScheduler";
            properties["quartz.scheduler.instanceId"]      = "instance_one";
            properties["quartz.threadPool.type"]           = "Quartz.Simpl.SimpleThreadPool, Quartz";
            properties["quartz.threadPool.threadCount"]    = "5";
            properties["quartz.threadPool.threadPriority"] = "Normal";
            properties["quartz.jobStore.misfireThreshold"] = "60000";
            properties["quartz.jobStore.type"]             = "Quartz.Impl.AdoJobStore.JobStoreTX, Quartz";
            properties["quartz.jobStore.useProperties"]    = "false";
            properties["quartz.jobStore.dataSource"]       = "default";
            properties["quartz.jobStore.tablePrefix"]      = "QRTZ_";
            properties["quartz.jobStore.clustered"]        = "true";
            // if running MS SQL Server we need this
            properties["quartz.jobStore.lockHandler.type"] = "Quartz.Impl.AdoJobStore.UpdateLockRowSemaphore, Quartz";

            properties["quartz.dataSource.default.connectionString"] = "Server=(local);Database=quartz;Trusted_Connection=True;";
            properties["quartz.dataSource.default.provider"]         = "SqlServer-20";

            // First we must get a reference to a scheduler
            ISchedulerFactory sf    = new StdSchedulerFactory(properties);
            IScheduler        sched = sf.GetScheduler();

            if (inClearJobs)
            {
                CleanUp(sched);
            }

            _log.Info("------- Initialization Complete -----------");

            if (inScheduleJobs)
            {
                _log.Info("------- Scheduling Jobs ------------------");

                string schedId = sched.SchedulerInstanceId;

                int count = 1;

                JobDetail job = new JobDetail("job_" + count, schedId, typeof(SimpleRecoveryJob));
                // ask scheduler to re-Execute this job if it was in progress when
                // the scheduler went down...
                job.RequestsRecovery = true;
                SimpleTrigger trigger = new SimpleTrigger("trig_" + count, schedId, 20, TimeSpan.FromMilliseconds(5000));

                trigger.StartTimeUtc = DateTime.UtcNow.AddMilliseconds(1000);
                sched.ScheduleJob(job, trigger);
                _log.Info(string.Format("{0} will run at: {1} and repeat: {2} times, every {3} seconds", job.FullName, trigger.GetNextFireTimeUtc(), trigger.RepeatCount, trigger.RepeatInterval.TotalSeconds));

                count++;
                job = new JobDetail("job_" + count, schedId, typeof(SimpleRecoveryJob));
                // ask scheduler to re-Execute this job if it was in progress when
                // the scheduler went down...
                job.RequestsRecovery = (true);
                trigger = new SimpleTrigger("trig_" + count, schedId, 20, TimeSpan.FromMilliseconds(5000));

                trigger.StartTimeUtc = DateTime.UtcNow.AddMilliseconds(2000);
                sched.ScheduleJob(job, trigger);
                _log.Info(string.Format("{0} will run at: {1} and repeat: {2} times, every {3} seconds", job.FullName, trigger.GetNextFireTimeUtc(), trigger.RepeatCount, trigger.RepeatInterval.TotalSeconds));

                count++;
                job = new JobDetail("job_" + count, schedId, typeof(SimpleRecoveryStatefulJob));
                // ask scheduler to re-Execute this job if it was in progress when
                // the scheduler went down...
                job.RequestsRecovery = true;
                trigger = new SimpleTrigger("trig_" + count, schedId, 20, TimeSpan.FromMilliseconds(3000));

                trigger.StartTimeUtc = DateTime.UtcNow.AddMilliseconds(1000);
                sched.ScheduleJob(job, trigger);
                _log.Info(string.Format("{0} will run at: {1} and repeat: {2} times, every {3} seconds", job.FullName, trigger.GetNextFireTimeUtc(), trigger.RepeatCount, trigger.RepeatInterval.TotalSeconds));

                count++;
                job = new JobDetail("job_" + count, schedId, typeof(SimpleRecoveryJob));
                // ask scheduler to re-Execute this job if it was in progress when
                // the scheduler went down...
                job.RequestsRecovery = true;
                trigger = new SimpleTrigger("trig_" + count, schedId, 20, TimeSpan.FromMilliseconds(4000));

                trigger.StartTimeUtc = (DateTime.UtcNow.AddMilliseconds(1000L));
                sched.ScheduleJob(job, trigger);
                _log.Info(string.Format("{0} will run at: {1} & repeat: {2}/{3}", job.FullName, trigger.GetNextFireTimeUtc(), trigger.RepeatCount, trigger.RepeatInterval));

                count++;
                job = new JobDetail("job_" + count, schedId, typeof(SimpleRecoveryJob));
                // ask scheduler to re-Execute this job if it was in progress when
                // the scheduler went down...
                job.RequestsRecovery = true;
                trigger = new SimpleTrigger("trig_" + count, schedId, 20, TimeSpan.FromMilliseconds(4500));

                trigger.StartTimeUtc = DateTime.UtcNow.AddMilliseconds(1000);
                sched.ScheduleJob(job, trigger);
                _log.Info(string.Format("{0} will run at: {1} & repeat: {2}/{3}", job.FullName, trigger.GetNextFireTimeUtc(), trigger.RepeatCount, trigger.RepeatInterval));
            }

            // jobs don't start firing until start() has been called...
            _log.Info("------- Starting Scheduler ---------------");
            sched.Start();
            _log.Info("------- Started Scheduler ----------------");

            _log.Info("------- Waiting for one hour... ----------");

            Thread.Sleep(TimeSpan.FromHours(1));


            _log.Info("------- Shutting Down --------------------");
            sched.Shutdown();
            _log.Info("------- Shutdown Complete ----------------");
        }