我正在使用 Quartz Scheduler(由于项目限制,版本为 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-tabpanel)。显然这可能会在 2.2 版中得到修复,但我不能等那么久,我也不相信我的问题是独一无二的!
我认为值得研究的几个选项:
计算 CronTrigger 的“结束时间”,但使用我自己的逻辑 - 这无法涵盖所有可能的情况,即使对于简单情况,也最多只能是近似值。
使用 TriggerListener 或 JobListener 跟踪否。作业的迭代次数,因为我只需要作业在“N”次迭代后停止,并且我有一个从作业实例到触发器的 1:1 映射。无论怎么想,这似乎都不太可行和/或高效。
你们中的任何一个使用过 CronTriggers 的人都可以选择“否”。发生的事件'请提供一些关于如何解决这个难题的见解?
最佳答案
似乎 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();
如果这行不通,那么如前所述here和 here ,您不能设置重复计数,您应该使用 TriggerListener。
无论如何,2.2 版本都没有这个功能。
更新
我已经测试过了,它有效。
关于java - 如何在 Java 中使用 CronTriggers 模拟 'No. of occurrences' 或 'Repeat Count'?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8692098/