java - 如何在 Java 中使用 CronTriggers 模拟 'No. of occurrences' 或 'Repeat Count'?

标签 java quartz-scheduler crontrigger

我正在使用 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 版中得到修复,但我不能等那么久,我也不相信我的问题是独一无二的!

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

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

  2. 使用 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();

如果这行不通,那么如前所述herehere ,您不能设置重复计数,您应该使用 TriggerListener。

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

更新

我已经测试过了,它有效。

关于java - 如何在 Java 中使用 CronTriggers 模拟 'No. of occurrences' 或 'Repeat Count'?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8692098/

相关文章:

java - Jahia 6.6 CMS - 编写自己的管理器

java - 在Java中将函数作为参数传递给方法并返回其返回值?

java - Quartz - 基于作业变量的关闭调度程序

java - quartz与spring集成,空指针异常

mysql - 使用 Cron Job 进行每日数据库备份

java - 在 SparkJava 中为静态文件添加 `before` 过滤器

java - 如何使用servlet运行一个简单的连接url程序?

quartz-scheduler - BLOCKED 状态对 Quartz 触发器意味着什么

Jenkins 声明式管道,每个分支具有不同的触发器

php - 我的 Laravel 调度程序每次运行时只运行一次,然后就停止了