5

我在 Grails 应用程序中有下一个 Quartz 作业。该作业计算一些统计数据并使用这些统计数据发送和发送电子邮件。我希望工作每天 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

4

3 回答 3

2

编辑

在这种情况下,以下分析并不适用。这只是一个基于原始误解事实的假设。如果被告知,我可以删除答案。

结尾

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

除了早上 7 点,它在什么时候触发?

早上 7 点下午 2 点晚上 9 点吗?

原因:

突出重要的措辞:-

" '/' 字符用于指定增量。例如,秒字段中的“0/15”表示“秒 0、15、30 和 45”。而秒字段中的“5/15”表示“秒”秒 5、20、35 和 50"。在 '/' 之前指定 '*' 相当于指定 0 是开头的值。本质上,对于表达式中的每个字段,都有一组数字可以打开或关闭。对于秒和分钟,数字范围从 0 到 59。对于小时 0 到 23,对于一个月中的几天,从 0 到 31,对于月份 1 到 12 。“/”字符只是帮助您打开给定集合中的每个“nth”值。因此,月份字段中的“7/6”仅打开月份“7”,这并不意味着每 6 个月,请注意微妙之处。"

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

这个最新的文档quartz-scheduler.org另有说明。看看这里的例子。还要研究“特殊字符/”。

根据我对secondsminutes[我不想等待 24 小时来测试 :)] 的测试,我强烈认为以下cronExpression内容将有效并每天触发execute()at :7:00 Hrs

回答:

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

让你知道你的测试结果。我坚信这会奏效。我还将为白天/晚上设置调度程序,以便在 24 小时后测试结果(我不想篡改 JVM 时钟以获得清晰的结果,尽管我成功测试了相同的篡改。) . 将发布我的实际测试结果。

于 2013-04-25T04:38:09.300 回答
2

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

于 2013-04-25T19:12:41.607 回答
1

这就是文档所说的

Day-of-Week 或 Day-of-Month 必须为“?”,否则您将收到错误消息,因为底层库的支持不完整。因此,您不能同时指定两个字段,也不能将两者都保留为所有值通配符“*”;这与 unix crontab 规范背道而驰。

希望有帮助

于 2013-04-24T17:07:24.200 回答