如何模拟'号Java中的CronTriggers出现'或'重复计数'?

时间:2012-01-01 06:28:30

标签: java quartz-scheduler crontrigger

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

我使用CronTriggers进行每日,每周和每月的重复模式。除了重复发生模式,我还提供了“否”的选项。发生的'。这已成为我生命中的祸根! CronTrigger没有像SimpleTriggers那样提供'repeatCount'选项(bug:https://jira.terracotta.org/jira/browse/QTZ-242?page=com.atlassian.jira.plugin.system.issuetabpanels%3Achangehistory-tabpanel)。显然这可以在版本2.2中修复,但我不能等待那么久,我也不相信我的问题是独一无二的!

我认为值得调查的几个选项:

  1. 计算CronTrigger的'EndTime'但使用我自己的逻辑 - 这不能涵盖所有可能的情况,即使对于简单的情况也只是近似。

  2. 使用TriggerListener或JobListener来跟踪号码。由于我只需要在'N'次迭代后停止工作,并且我从Job实例到Trigger的1:1映射,因此作业的迭代次数。在任何想象中,这似乎都不可行和/或有效。

  3. 你们中的任何一个人都可以选择使用CronTriggers吗?对于如何解决这个难题,请提供一些见解?

2 个答案:

答案 0 :(得分:3)

似乎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版都没有此功能。

<强>更新

我已经测试了它,但它确实有效。

答案 1 :(得分:0)

为什么不使用简单触发器?您可以在计划作业时计算时间间隔,但这将是一次性活动。