我知道有重复的 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
,请记住 它必须有一个 nextValidTime
1。否则,您将其传递给的调度程序将简单地拒绝它,并出现上述异常。
我建议修改测试代码如下:
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/