Quartz Java恢复作业执行多次

问题描述 投票:22回答:3

对于我的应用程序,我创建作业并使用CronTriggers安排它们。每个作业只有一个触发器,并且作业名称和触发器名称都相同。没有作业共享触发器。

现在,当我创建一个像这样的cron触发器“ 0/1 * * * *?”来指示作业每秒执行一次时,它就可以正常工作。

当我第一次通过致电暂停工作时出现问题:

scheduler.pauseJob(jobName, jobGroup);

然后再说50秒,然后使用:]恢复工作

scheduler.resumeJob(jobName, jobGroup);

我看到的是,在这50秒钟中,作业没有按要求执行。但是当我恢复工作的那一刻,我看到同时执行了50个工作!!!>

我以为这是由于失火指令的默认设置,但即使在创建触发器时将触发器的失火指令设置为此:

trigger.setMisfireInstruction(CronTrigger.MISFIRE_INSTRUCTION_DO_NOTHING);

发生同样的事情。谁能建议解决此问题的方法?

对于我的应用程序,我创建作业并使用CronTriggers安排它们。每个作业只有一个触发器,并且作业名称和触发器名称都相同。没有作业共享触发器。现在当我...

java scheduling scheduled-tasks quartz-scheduler
3个回答
30
投票

CronTrigger通过记住nextFireTime起作用。创建触发器后,将初始化nextFireTime。每次触发作业nextFireTime都会更新。由于暂停时未触发作业,因此nextFireTime保持“旧”。因此,在恢复作业后,触发器将返回每个旧的触发器时间。


5
投票

如果您暂停作业,触发器将继续触发,但是执行将排队直到作业恢复。这不是触发失败的触发器,因此该设置将无效。


1
投票

至少从1.6.5版本开始(指尖的最早版本的石英),调度程序具有一个pauseTrigger方法,该方法将名称/组作为参数。这意味着您不必拥有所使用的每种触发器类型的子类,也不必进行时髦的删除/插入技巧。

© www.soinside.com 2019 - 2024. All rights reserved.