4

我正在使用 Quartz 调度程序(版本 1.8.3,由于项目限制),我被分配了为特定于我的项目的作业创建“类似 MS Outlook”的调度程序的任务。一切似乎都很好,但我对 CronTriggers 有一个非常大的问题(这个问题也存在于 Quartz 2.1 版中):

我将 CronTriggers 用于每日、每周和每月的重复模式。除了重复模式之外,我还提供了“否”选项。的发生”。这成了我人生的祸根!CronTrigger 没有像 SimpleTriggers 那样为“repeatCount”提供选项(错误:https ://jira.terracotta.org/jira/browse/QTZ-242?page=com.atlassian.jira.plugin.system.issuetabpanels%3Achangehistory-选项卡)。显然这可能会在 2.2 版中得到解决,但我不能等那么久,我也不相信我的问题是独一无二的!

我认为值得研究的几个选项:

  1. 计算 CronTrigger 的“结束时间”,但使用我自己的逻辑 - 这无法涵盖所有​​可能的情况,即使对于简单的情况也只能是近似值。

  2. 使用 TriggerListener 或 JobListener 来跟踪 no。作业的迭代次数,因为我只需要在“N”次迭代后停止作业,并且我有一个从作业实例到触发器的 1:1 映射。无论如何,这似乎都不是很可行和/或有效的。

任何使用过 CronTriggers 的人都可以选择“否”。请给出一些关于如何解决这个难题的见解?

4

2 回答 2

4

似乎 Quartz 已经实现了一些可以提供帮助的东西:TriggerUtils.computeEndTimeToAllowParticularNumberOfFirings

我还没有测试过,但这是我现在写的代码:

CronTrigger trigger = newTrigger()
    .withSchedule(cronSchedule(cronExpression))
    .build();
Date endDate = TriggerUtils.computeEndTimeToAllowParticularNumberOfFirings((OperableTrigger) trigger,
              new BaseCalendar(Calendar.getInstance().getTimeZone()), 10);
trigger = trigger.getTriggerBuilder().endAt(endDate).build();

如果这不起作用,那么如herehere所说,您无法设置重复计数,您应该使用TriggerListener。

无论如何,2.2 版都没有这个功能。

更新

我已经测试过了,它可以工作。

于 2014-10-12T16:21:46.593 回答
0

你为什么不改用简单触发器?您将需要在安排作业时计算时间间隔的额外任务,但这将是一次性活动。

于 2012-01-13T03:27:04.793 回答