spring - quartz : Cron expression that will never execute

标签 spring quartz-scheduler

我知道有重复的 here ,这可能正是我的情况,尽管它应该得到一些更好的解释,我将在这里尝试提供。

我使用 Spring 应用程序上下文处理 Java Web 应用程序。在这种情况下,我使用 Quartz 定义了计划作业。这些作业由 .properties 文件中定义的 cron 触发。

Spring 上下文嵌入在 war 中,而 .properties 文件位于应用程序服务器上(在本例中为 Tomcat)。

这很好,允许根据环境(开发、集成、生产......)定义不同的 crons。

现在,当在我自己的计算机上本地运行此应用程序时,我不希望执行这些作业。有没有办法编写一个永远不会触发的 cron 表达式?

最佳答案

TL;DR

在 Quartz 1 中,你可以使用这个 cron:59 59 23 31 12 ? 2099(最后有效日期)。
在 Quartz 2 中,你可以使用这个 cron:0 0 0 1 1 ? 2200

使用远在未来的表达

使用 org.quartz.CronExpression 做了一些快速测试。

String exp = "0 0 0 1 1 ? 3000";
boolean valid = CronExpression.isValidExpression(exp);
System.out.println(valid);
if (valid) {
    CronExpression cronExpression = new CronExpression(exp);
    System.out.println(cronExpression.getNextValidTimeAfter(new Date()));
}

当我执行 String exp = "# 0 0 0 1 1 ?"; 时,isValid 测试返回 false

使用上面给出的示例,输出如下:

true
null

意思:

  • 表达式有效;
  • 没有与此表达式匹配的即将到来的日期。

但是,为了让调度程序接受 cron 触发器,后者必须匹配 future 的日期。

我尝试了几年,发现一旦年份超过 2300,Quartz 似乎不再打扰(尽管我没有发现一年的最大值 in Quartz 2's documentation )。可能有一种更清洁的方法可以做到这一点,但这将满足我现在的需求。

那么,最后,我建议的 cron 是 0 0 0 1 1 吗? 2200.

quartz 1 变体

请注意,在 Quartz 1 中,2099 is the last valid year .因此,您可以调整您的 cron 表达式以使用 Maciej Matys's suggestion : 59 59 23 31 12 ? 2099

替代方案:使用过去的日期

Arnaud Denoyelle提出了一些更优雅的建议,我上面的测试证明这是一个正确的表达方式:不要选择遥远的 future ,而是选择遥远的过去:

0 0 0 1 1 ? 1970(根据 Quartz 文档的第一个有效表达式)。

但此解决方案不起作用。

hippofluff强调 Quartz 会检测到一个过去的表达式将永远不会再次执行,因此会抛出异常。

org.quartz.SchedulerException: Based on configured schedule, the given trigger will never fire.

这似乎是 Quartz for a long time .

经验教训:测试并非万无一失

这凸显了我的测试的一个弱点:如果您想测试 CronExpression,请记住 它必须有一个 nextValidTime1。否则,您将其传递给的调度程序将简单地拒绝它,并出现上述异常。

我建议修改测试代码如下:

String exp = "0 0 0 1 1 ? 3000";
boolean valid = CronExpression.isValidExpression(exp);
if (valid) {
    CronExpression cronExpression = new CronExpression(exp);
    valid = cronExpression.getNextValidTimeAfter(new Date()) != null;
}
System.out.println("Can I use <" + exp + ">? " + (valid ? "Go ahead!" : "This shall fail."));

你去:无需思考,只需阅读输出。


1 这是我在测试 Arnaud 的解决方案时忘记的部分,使我成为傻瓜并证明我的测试不是我的证明。

关于spring - quartz : Cron expression that will never execute,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13835221/

相关文章:

spring - 带有 Spring Boot 的多模块 Maven 示例

java - Spring注解-未登录用户重定向

java - 使用 Quartz 轮询外部服务并通过 Atmosphere 将结果发送给客户端?

java - 何时调用quartz Scheduler JobListener.jobWasExecuted()方法?

java - quartz如何启动EJB无状态组件?

java - 无法找到 XML 模式命名空间的 Spring NamespaceHandler [http ://www. springframework.org/schema/mvc

java - 使用 RESTeasy 3 validator 进行 Spring 4 依赖注入(inject)

c# - quartz 中的计划外工作

.net - 如何在 .NET 中执行基于时间/计划的事件?

java - Hibernate 左连接获取许多返回的口是心非