如何模拟’号 在Java中使用CronTriggers发生’或’重复计数’?
我正在使用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中修复,但我不能等待那么久,我也不相信我的问题是独一无二的!
我认为值得调查的几个选项:
-
计算CronTrigger的’EndTime’,但使用我自己的逻辑 – 这不能涵盖所有可能的情况,即使对于简单的情况也只是近似。
-
使用TriggerListener或JobListener来跟踪no。 由于我只需要在’N’次迭代后停止工作,并且我从Job实例到Trigger的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();
如果这不起作用,那么就像这里和这里所说的那样,你不能设置重复计数,你应该使用TriggerListener。
无论如何,2.2版本没有此function。
更新
我测试了它,它的工作原理。
你不能使用简单触发器吗? 您可以在计划作业时计算时间间隔,但这将是一次性活动。