我正在努力将Quartz从1.8.6升级到2.2.1。
在前面的代码中,我们创建了一个类似的触发器:
Trigger trigger = TriggerUtils.makeImmediateTrigger(0, 0);
这是以前有效的语法。但是,自Quartz 2以来,他们转而使用基于构建器的系统。以下是我认为会完成相同的事情,但是,我收到错误Repeat Interval Cannot Be Zero
。
Trigger trigger = newTrigger()
.withIdentity(getImmediateTriggerName(jobInfo))
.forJob(job)
.withSchedule(simpleSchedule()
.withIntervalInMilliseconds(0)
.withRepeatCount(-1))
.build();
显然这不起作用,所以我想知道完成我们以前做过的同样事情的最佳方法是什么。
由于
答案 0 :(得分:1)
您似乎只想触发一次。
根据Quartz 1.8 source,调用TriggerUtils.makeImmediateTrigger(0, 0)
会创建一个重复计数为0且重复间隔为0的SimpleTrigger
。根据Quartz 1.8 tutorial,示例1,这会创建一个触发器只发射一次。因此,这似乎是您的Quartz 1.8代码所做的。
来自Quartz 2.2 TriggerBuilder API documentation:
[If]你没有调用 withSchedule(..)方法,将立即使用一次默认的触发计划。
所以,看起来您需要做的就是从触发器中删除withSchedule
部分:
Trigger trigger = newTrigger()
.withIdentity(getImmediateTriggerName(jobInfo))
.forJob(job)
.build();
我很欣赏Quartz 1.8文档并不完全清楚重复计数。 documentation for the Quartz 2.2 ScheduleBuilder在这一点上要清楚得多:重复计数不包括第一次射击。尽管看到你的代码试图将重复计数设置为-1,但我无法相信你真的希望触发器永远不会触发,如triggers are automatically deleted after they have repeated the required number of times,并且创建触发器只是为了立即删除它是没有意义的没有它射击。实际上,如果将重复间隔设置为正数毫秒并将重复计数保留为-1,you would get an error about the repeat count being negative。
答案 1 :(得分:0)
您也可以通过此触发器延迟启动作业
Trigger jobTrigger = TriggerBuilder.newTrigger()
.withIdentity(jobname, groupName)
.startAt(new Date(System.currentTimeMillis() + startInterval * 1000L) )
.build();
这种方式触发器会延迟,但作业不会重复
如果不需要延迟启动
Trigger jobTrigger = TriggerBuilder.newTrigger()
.withIdentity(jobname, groupName)
.build();
会做
答案 2 :(得分:0)
这里的问题非常明确。在我遇到同样的问题并解决之后,我能够得出这个结论。
这是问题所在。
Trigger trigger = newTrigger()
.withIdentity(getImmediateTriggerName(jobInfo))
.forJob(job)
.withSchedule(simpleSchedule()
.withIntervalInMilliseconds(0)
.withRepeatCount(-1))
.build();
问题在于 .withIntervalInMilliseconds(0) .withRepeatCount(-1)因为无法将Interval指定为零。只需使用simpleSchedule(),默认情况下只触发一次。
以下列方式使用,
Trigger trigger = newTrigger()
.withIdentity(getImmediateTriggerName(jobInfo))
.forJob(job)
.withSchedule(simpleSchedule())
.build();