当前位置: 首页 > 面试题库 >

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

佴博实
2023-03-14
问题内容

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

Spring上下文嵌入战争中,而.properties文件位于应用程序服务器(在这种情况下为Tomcat)上。

这很好,并允许根据环境(开发,集成,生产等)定义不同的克朗。

现在,在我自己的计算机上本地运行此应用程序时,我不希望执行这些作业。有没有办法编写永远不会触发的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触发器,后者必须与将来的日期匹配。

我尝试了几年,发现一旦年份超过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."));

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



 类似资料:
  • 我有这份工作: 作业应该每小时运行一次。我以为问题是cronexpression。这就是为什么我把它改成上面的表达式。在我有这个表达之前: null

  • 问题内容: 我正在使用Flask-WTF: 这是我的表格: 这是控制器: 现在的问题是,如果您查看我的打印语句,它将始终打印已提交的内容,但从不打印有效的内容,并且永远不会执行validate_on_submit()。为什么? 问题答案: 您没有在HTML表单中插入CSRF字段。 添加到模板(docs)后,表单将按预期验证。 验证表单后添加,以查看出现的错误。 在验证之前将为空。在这种情况下,会出

  • null 上个月的第一天和本月的第一天 上月1日和本月第3个工作日 当前星期的星期一日期和当前星期的staturday日期。

  • 我正在使用石英调度程序来安排我的工作。我有一个错误的cron表达式: 当我这样做的时候: is。但是当我查看表达式时,它显然是错误的。其他人也面临类似的问题吗? 注:包装为:包装组织。石英 石英的版本是:2.2.3 请检查来自的CronExpression类http://www.javadoc.io/doc/org.quartz-scheduler/quartz/2.2.3 我还尝试了类的方法,但

  • 问题内容: 该程序的目的是单击以创建圆,ballball类扩展了test1,当test1检测到鼠标单击时,即创建了ballball对象。但是paint / paintComponent方法永远不会执行。在我的程序结构中,是否可以将圆圈绘制到超类JPanel? 问题答案: 不是,它没有可以覆盖的方法。相反,您可以扩展a 并将其添加到框架中。

  • 我明白了如何生成一个cron表达式来在每天的特定时间运行,现在我已经在中午和15:30 mon-sat运行了。不过,我希望是在周六15:00而不是15:30。有什么方法可以把它写成cron表达式吗?或者我需要为周六做一个单独的触发?