栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Quartz:永远不会执行的Cron表达式

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Quartz:永远不会执行的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。

有了上面给出的示例,输出如下:

truenull

含义:

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

但是,要使调度程序接受cron触发器,后者必须与将来的日期匹配。

我尝试了几年,发现一旦年份超过2300,Quartz似乎就不再打扰了(尽管我在Quartz 2的文档中没有提到该年份的最大值)。可能会有更清洁的方法来执行此操作,但这将满足我的需求。

因此,最后,我建议的时间表是0 0 0 1 1 ? 2200。

Quartz 1 variant

请注意,在Quartz 1中,2099是最后一个有效年份。因此,你可以调整cron表达式以使用Maciej Matys的建议:59 59 23 31 12 ? 2099

替代方法:使用过去的日期
Arnaud Denoyelle提出了一个更优雅的建议,上面的测试证明了这一说法是正确的:与其选择一个很远的日期,不如选择一个很远的日期:

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

但是,此解决方案不起作用。

hippofluff强调说Quartz过去将检测到一个表达式,将不再执行,因此将引发异常。

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

这似乎已经在Quartz 很久了。

获得的经验:测试并非万无一失
这凸显了我的测试的弱点:如果要测试a 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."));

到此为止:无需思考,只需阅读输出即可。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/372683.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号