0

我有一个用 Java 编写的报告创建程序,需要每周一运行,我使用 Quartz 作为我的调度部分。诀窍是,需要生成的报告数量各不相同;取决于星期一是每月的第一天,还是接下来的星期一。

为了实现这一点,我所做的是为每月的每个星期一创建一个触发器,第一个星期一指向特定的工作类别,而其余的星期一(触发器)指向另一个工作类别。

        .withIdentity("trigger1", "group1")
        .withSchedule(cronSchedule("0 1 0 ? 1/1 MON#1 *"))
        .build();

        .withIdentity("trigger2", "group1")
        .withSchedule(cronSchedule("0 1 0 ? 1/1 MON#2 *"))
        .build();

依此类推,直到我到达

        .withIdentity("trigger5", "group1")
        .withSchedule(cronSchedule("0 1 0 ? 1/1 MON#5 *"))
        .build();

它达到了 MON#5,因为一个月可能有 5 个星期一;就像这个十月一样。这很好,它有效(我认为),但我的问题是这个。有没有办法结合我的 cron 计划,这样我在接下来的星期一只需要一个触发器?就像是;

        .withSchedule(cronSchedule("0 1 0 ? 1/1 MON#2,MON#3,MON#4,MON#5 *"))

如果有,请不吝赐教。如果我只是在我的编程中遗漏了一些东西,或者如果迷宫中存在一个未知页面,它是引导我了解真相的网络,那么请指出我正确的方向。

非常感谢您的客气话。谢谢

ps:我包含了一个 cron 标签,尽管它说它是用于 UNIX 计算机的。我相信 Quartz cron 和 Unix cron 之间几乎没有区别。如果有,请告诉我。

4

4 回答 4

1

就个人而言,我会将这种逻辑放在 Java 中而不是 Quartz 配置中。让 Quartz 始终执行 Java 作业调度程序,然后根据日期确定要运行哪些报告。

于 2012-10-18T13:11:30.983 回答
1

让 cron 在每月的第一个 X 天运行某些东西的常用 unix 解决方法是让 cron 在表单上触发脚本:

#! /usr/bin/bash
day=$( date +%d )
if ( ( day <= 7 ) ) ; then
    exec firstdayofthemonthshellscript.sh
fi

在表单上有一个 crontab 条目

0 0 * * 1 wrapperscript.sh

(例如星期一)。

总而言之,我认为使用 Quartz cron 也不容易实现您的目标,但也许您可以在实现中使用上述技巧。

干杯,

于 2012-10-18T09:15:59.183 回答
1

看起来您的问题没有正式的解决方案。

这是 Quartz 2.0文档的引用:

星期几字段允许使用“#”字符。此字符用于指定一个月中的“第 n 个”XXX 天。例如,星期几字段中的“6#3”值表示该月的第三个星期五(第 6 天 = 星期五,“#3” = 该月的第三个星期五)。其他示例:“2#1”= 每月的第一个星期一,“4#5”= 每月的第五个星期三。请注意,如果您指定“#5”并且当月没有给定的星期几中的 5 个,则该月不会发生触发。如果使用 '#' 字符,则星期字段中只能有一个表达式(“3#1,6#3”无效,因为有两个表达式)。

这也有一个开放的错误

于 2012-10-18T09:16:45.927 回答
0

正如 Tomer 所说,Quartz 不支持这种用例。但是如果 Quartz 不是一个约束,可以在cron-utils创建一个有效的表达式。下面是一个例子:

String multicron = "0 1 0 ? 1/1 MON#2|MON#3|MON#4|MON#5 *";
CronDefinition definition = CronDefinitionBuilder.instanceDefinitionFor(CronType.QUARTZ);
CronParser parser = new CronParser(definition);
Cron cron = parser.parse(multicron);

cron-utils 目前不提供执行作业的方法,但会为您提供任何给定日期的下一个/上一个执行时间。

于 2018-03-24T12:51:08.180 回答