我正在努力将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();
显然这不起作用,所以我想知道完成我们以前做过的同样事情的最佳方法是什么。
谢谢
看起来你想让触发器只触发一次。
根据Quartz 1.8 source,调用TriggerUtils.makeImmediateTrigger(0, 0)
创建一个SimpleTrigger
,重复计数为0,重复间隔为0.根据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。
您也可以通过此触发器延迟启动作业
Trigger jobTrigger = TriggerBuilder.newTrigger()
.withIdentity(jobname, groupName)
.startAt(new Date(System.currentTimeMillis() + startInterval * 1000L) )
.build();
这种方式触发器会延迟,但作业不会重复
如果不需要延迟启动
Trigger jobTrigger = TriggerBuilder.newTrigger()
.withIdentity(jobname, groupName)
.build();
会做
这里的问题很清楚。在我遇到同样的问题并解决之后,我能够得出结论。
这是问题所在。
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();