【问题标题】:Java Quartz - cron expressionJava Quartz - cron 表达式
【发布时间】:2012-10-18 08:24:21
【问题描述】:

我有一个用 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 *"))

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

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

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

【问题讨论】:

    标签: java cron quartz-scheduler


    【解决方案1】:

    您的问题似乎没有正式的解决方案。

    这里引用 Quartz 2.0 documentation:

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

    this. 上还有一个开放的 bug

    【讨论】:

    • 感谢赐教。我想我将不得不用我所拥有的。
    【解决方案2】:

    让 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 也不容易实现您的目标,但也许您可以在实现中使用上述技巧。

    干杯,

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        如 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 目前不提供执行作业的方法,但会为您提供任何给定日期的下一个/上一个执行时间。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-25
          • 1970-01-01
          • 2012-04-18
          • 2021-07-17
          • 1970-01-01
          • 2013-03-05
          相关资源
          最近更新 更多