Grails应用程序中的石英作业被触发三次



我在Grails应用程序中有下一个Quartz Job。该作业计算一些统计数据,并使用这些统计数据发送电子邮件。我希望每天7点完成这项工作。

我的问题是工作每天触发三次而不是一次。

class DailyEmailJob  {
    def eventService 
    static triggers = {
        cron name: 'emailTrigger', cronExpression: "0 0 7 * * ?"
    }
    def execute() {
        eventService.send24StatsEmail()
    }
}

我在Apache Tomcat/7.0.35中托管Grails应用程序,运行Grails 2.2.1和quartz-1.0-RC6

您的cron表达式看起来不错。Tomcat的自动部署特性可能是罪魁祸首。有关一些建议,请参阅:https://stackoverflow.com/a/11990221

EDIT

下面的分析在这个场景中成立。这只是一个基于被误解的原始事实的假设。如果建议,我可以删除答案。

我希望我能回答我自己在评论中提出的问题。

"它在早上7点以外的时间被触发? "

7点

, 下午2点 9点 ?

原因:

  • 指使用org.quartz-scheduler:quartz:1.8.4quartz插件[quartz-1.0-RC6]版本。参考BuildConfig。groovy from Github.
  • 从相应的Javadoc遵循CronExpression API

强调重要的措辞:-

" '/'字符用于指定增量。例如,seconds字段中的"0/15"表示"秒为0、15、30和45"。秒字段中的"5/15"表示"秒5、20、35和50"。在'/'前指定'*'相当于指定以0作为起始值。实际上,对于表达式中的每个字段,都有一组可以打开或关闭的数字。秒和分的取值范围是0 ~ 59。0 ~ 23小时,0 ~ 31天,1 ~ 12月。"/"字符只是帮助您打开给定集合中的每个"第n"值。因此,月份字段中的"7/6"只表示"7"月份,而不是表示每6个月,请注意这一微妙之处。"

在您的示例中,cron表达式:"0 0 7 * * ?"导致在24小时(一天)中每7小时运行一次作业,导致在上午7点,(7 + 7)下午2点,(7 + 7 + 7)晚上9点运行。

quartz-scheduler.org的最新文档可不是这样说的。看一下这里的例子。还要学习"特殊字符/"。

根据我对secondsminutes的测试[我不想等待24小时来测试:)],我强烈认为下面的cronExpression将起作用,并在每天的7:00 Hrs触发execute():

答:

  1. "0 0 7/23 * * ?"[从每天第7小时0分和0秒开始,每24小时运行一次作业]
  2. "0 0 0/23,7 * * ?"[与答案1同义但不那么冗长]

告知您的测试结果。我坚信这是可行的。我还将为白天/晚上设置调度器,以便在24小时后测试结果(我不想为了获得清晰的结果而篡改JVM时钟,尽管我成功地进行了相同的篡改测试)。将张贴我的实际测试结果

文档是这么说的

必须是"?",否则您将得到一个错误,因为底层库的支持不完整。所以你不能同时指定两个字段,也不能把它们都作为通配符"*";这是对Unix crontab规范的背离。

希望有帮助

最新更新