Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring 即使设置了缺火指令,运行缺失触发器的石英调度器_Spring_Quartz Scheduler_Scheduler - Fatal编程技术网

Spring 即使设置了缺火指令,运行缺失触发器的石英调度器

Spring 即使设置了缺火指令,运行缺失触发器的石英调度器,spring,quartz-scheduler,scheduler,Spring,Quartz Scheduler,Scheduler,我的石英调度器有问题。为了实用,您可以在这里找到我的单元测试代码: Scheduler scheduler = new StdSchedulerFactory().getScheduler(); scheduler.getListenerManager().addSchedulerListener(schedulerTestListener); Trigger trigger = newTrigger() .withIdentity(CoreTestConst

我的石英调度器有问题。为了实用,您可以在这里找到我的单元测试代码:

Scheduler scheduler = new StdSchedulerFactory().getScheduler();
scheduler.getListenerManager().addSchedulerListener(schedulerTestListener); 

    Trigger trigger = newTrigger()
            .withIdentity(CoreTestConstants.TEST_TRIGGER, CoreTestConstants.TEST_TRIGGER_GROUP)
            .withSchedule(simpleSchedule()
                    .withMisfireHandlingInstructionIgnoreMisfires()
                    .withIntervalInMilliseconds(1000)
                    .repeatForever())
            .forJob(CoreTestConstants.TEST_JOB, CoreTestConstants.TEST_JOB_GROUP)
            .build(); 


scheduler.scheduleJob(getJobDetail(), trigger);

Thread.sleep(20000L);

scheduler.start();

问题是,当执行scheduler.scheduleJob(…)时,我发现任务没有立即启动,但是当执行scheduler.start()时,我看到20个任务正在立即执行

我的意思是,通常在我看来,任务在scheduler.start()执行之前不应该被记录或启动。但不知何故,quartz系统甚至在scheduler.start()未执行之前就保持了任务的状态,然后当scheduler.start()调用时,会立即触发缺少的任务执行

以下是日志:

09:32:45,005  INFO StdSchedulerFactory:1310 - Quartz scheduler version: 2.1.5
09:32:51,013  INFO SchedulerTest:47 - [test] Scheduler starting..
09:32:51,014  INFO QuartzScheduler:534 - Scheduler DefaultQuartzScheduler_$_NON_CLUSTERED started.
*** [TIMER-TEST] 2012-10-10 09:32:51 / Test task is executed. Count: 1 / 1349850771037
*** [TIMER-TEST] 2012-10-10 09:32:51 / Test task is executed. Count: 2 / 1349850771040
*** [TIMER-TEST] 2012-10-10 09:32:51 / Test task is executed. Count: 3 / 1349850771040
*** [TIMER-TEST] 2012-10-10 09:32:51 / Test task is executed. Count: 4 / 1349850771041
*** [TIMER-TEST] 2012-10-10 09:32:51 / Test task is executed. Count: 5 / 1349850771042
*** [TIMER-TEST] 2012-10-10 09:32:51 / Test task is executed. Count: 6 / 1349850771043
*** [TIMER-TEST] 2012-10-10 09:32:51 / Test task is executed. Count: 7 / 1349850771044
您可以看到,即使我将触发器设置为在1秒内以间隔执行,它也会在线程睡眠期间执行丢失的任务

我试图绕过失火指令,但这毫无意义,在我的情况下,它不会改变代码的行为


任何帮助都将不胜感激。提前感谢。

好的,您的问题在于
线程。睡眠(20000L)在等待时,实际上会触发并调度作业。因此,当启动时,所有调度作业都会启动,您可以将Thread.sleep设置为
触发触发器
,以便它在等待后开始触发和调度

您能给出quartz和spring的依赖关系吗?quartz 2.1.5 spring 3.1.0.Release我想指出的问题是quartz调度的行为。当作业被安排时启动计时器不是很明智吗?相反,我认为合乎逻辑的方式是在调用scheduler.start()时开始调度和启动。@Bariscan是的,你是对的,我完全同意你的看法:)但它不是那样工作的。。。TriggerBuilder在作业上设置一个触发器并开始计数,当执行scheduleJob时,quartz会根据触发器(已启动)创建一个计划映射,并在等待20秒时,触发器仍在运行,并且正在调度作业,然后当您启动时,所有计划作业开始运行。你可以看一个石英的例子