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

时间:2013-04-08 05:42:22

标签: grails quartz-scheduler

我在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

3 个答案:

答案 0 :(得分:2)

修改

以下分析在此方案中保持良好状态。这只是一个基于原始误解事实的假设。如果建议,我可以删除答案。

<强> END

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

除了上午7点以外它会触发什么次?

上午7点 2 PM 9 PM

<强>原因:

突出重要的措辞: -

'/'字符用于指定增量。例如,秒字段中的”0/15“表示”秒0,15,30和45“。和”5/15“in秒字段表示“秒5,20,35和50”。在'/'之前指定'*'等同于指定0是要开始的值。基本上,对于表达式中的每个字段,有一个可以打开或关闭的一组数字。对于秒和分钟,数字范围从0到59.对于0到23小时,0到31个月以及1到12个月。 “/”字符只是帮助你打开给定集合中的每个“第n”值。因此月份字段中的“7/6”仅打开月份“7”,这并不意味着每6个月,请注意细微之处。

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

来自"0 0 7 * * ?"的最新文档另有说法。看一下示例here。还要学习“特殊字符/”。

基于我对quartz-scheduler.orgseconds的测试[我不想等待24小时测试:)],我强烈认为下面的minutes会起作用并触发每天cronExpression完全execute()

<强>答案:

  1. 7:00 Hrs [从第7小时第0小时开始每隔24小时开始工作]
  2. "0 0 7/23 * * ?" [同义回答1但不那么详细。]
  3. 让我们知道您的测试结果。我坚信这会奏效。我还要将调度程序设置为白天/晚上,以便在24小时后测试结果(我不想篡改JVM时钟以获得清晰的结果,尽管我成功测试了同样的篡改。) 。将发布我的实际测试结果。

答案 1 :(得分:2)

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

答案 2 :(得分:1)

这就是文档所说的

每周或每周都必须是&#34;?&#34;,否则您将收到错误,因为底层库的支持尚未完成。因此,您无法指定两个字段,也不能将两者都保留为所有值通配符&#34; *&#34 ;;这与unix crontab规范背道而驰。

希望有所帮助