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

Grails应用程序中的Quartz作业被触发三次,grails,quartz-scheduler,Grails,Quartz Scheduler,我有Grails应用程序中的下一个Quartz工作。作业计算一些统计数据,并使用这些统计数据发送和发送电子邮件。我希望这项工作每天7点执行 我的问题是这项工作每天要做三次,而不是一次。 class DailyEmailJob { def eventService static triggers = { cron name: 'emailTrigger', cronExpression: "0 0 7 * * ?" } def execute

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

我的问题是这项工作每天要做三次,而不是一次。

class DailyEmailJob  {
    def eventService 

    static triggers = {
        cron name: 'emailTrigger', cronExpression: "0 0 7 * * ?"
    }

    def execute() {
        eventService.send24StatsEmail()
    }
}

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

每周或每月的某一天必须为“”,否则您将收到一个错误,因为基础库的支持尚未完成。因此,不能同时指定这两个字段,也不能将这两个字段都保留为all values通配符“*”;这与unix crontab规范不同

希望对编辑有所帮助

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

结束

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

“除上午7点外,它触发的次数是多少?”

是上午7点、下午2点和晚上9点吗

原因:

  • 请参阅
    quartz
    插件[quartz-1.0-RC6]的版本,该插件使用
    org.quartz调度程序:quartz:1.8.4
    。参考
  • 遵循相应响应中的
    CronExpression
    API
突出重要的措辞:-

“/”字符用于指定增量。例如,秒字段中的“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
的最新文档,它的说法与此不同。请查看示例。同时研究“特殊字符/”

根据我在
分钟
[我不想等待24小时进行测试:)]上的测试,我强烈认为下面的
cronExpression
将正常工作,并在每天的
7:00时触发
execute()

回答:

  • “0 0 7/23**?”
    [从每天的第7小时、第0分钟和第0秒开始,每24小时运行一次作业]
  • “0/23,7**?”
    [与答案1同义,但不太详细。]

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

    你的cron表达式看起来不错。Tomcat的自动部署功能可能是罪魁祸首。有关一些建议,请参阅:

    你在哪里托管它?我遇到过类似的问题…应用程序是否只安装在一台应用程序服务器上?我正在VPS中的Rimuhosting.com中托管它。该应用程序刚刚安装在我n one TOMCAT很抱歉后续的时间太晚了。我唯一的理论是你可能有三个实例在运行。我在Heroku上部署了一个应用程序,有两个dynos,在我只有一个dynos之前,我只收到一封邮件。建议使用新的QUARTZ2插件…quartz 1插件已经过时,bogusIt不会在三个不同的时间触发。它7:00准时触发,几秒钟内触发三次cron表达式非常完美,根据您提到的文档进行检查,请不要误导。尝试使用grails quartz插件了吗?我添加了一个deployOnStartup=“false”autoDeploy=“false”“而今天它只触发了两次。可能是因为我在$CATALINA_HOME/webappsYes下有war和目录,这可以解释它。我相信这种行为还取决于应用程序的
    上下文的定义(即在
    server.xml
    中,在
    conf\Catalina\localhost
    下自己的
    .xml
    文件中),在任何情况下,尝试将.war文件移出webapps;我相信这会有帮助。我也有同样的问题,我不确定这是否是原因。。我的工作总是触发三次。为什么不是两个或四个@塞尔吉奥德拉莫