【问题标题】:Quartz Job in a Grails Application being triggered three timesGrails 应用程序中的 Quartz 作业被触发 3 次
【发布时间】:2013-04-08 05:42:22
【问题描述】:

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

我的问题是作业每天触发 3 次而不是一次。

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

【问题讨论】:

  • 你在哪里托管它?我也遇到过类似的问题...
  • 应用是否只安装在一个应用服务器上?
  • 我在 VPS 的 Rimuhosting.com 中托管。该应用程序只是安装在一个tomcat中
  • 抱歉,后续跟进晚了。我唯一的理论是您可能正在运行三个实例。我在 Heroku 上部署了一个带有 2 个 dyno 的应用程序,之前我只有一个,我只收到一封邮件。
  • 作为建议使用新的 QUARTZ2 PLUGIN grails.org/plugin/quartz2 ...quartz 1 插件已过时且伪造

标签: grails quartz-scheduler


【解决方案1】:

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

【讨论】:

  • 我添加了一个 deployOnStartup="false" autoDeploy="false" 今天它只触发了两次。可能是因为我在 $CATALINA_HOME/webapps 下有战争和目录
  • 是的,这可以解释。我相信该行为还取决于您的应用程序的Context 是如何定义的(即在server.xml?在它自己的.xml 文件中conf\Catalina\localhost 下?)无论如何,请尝试将您的.war 文件移出webapps;我相信这会有所帮助。
  • 我也遇到了同样的问题,我不确定这是否是原因。我的工作总是触发 3 次。为什么不是两个四个? @SergiodelAmo
【解决方案2】:

编辑

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

结束

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

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

现在是 7 AM2 PM9 PM 吗?

原因:

强调重要的措辞:-

"'/' 字符用于指定增量。例如,秒字段中的“0/15”表示“秒 0、15、30 和 45”。而“5/15”在seconds 字段表示“秒 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 的最新文档另有说明。查看示例here。还要研究“特殊字符/”。

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

答案:

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

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

【讨论】:

  • 它不会在三个不同的时间触发。它在几秒钟内在 7:00 整点触发 3 次
  • cron 表达式是完美的,根据您提到的文档进行检查,不要误导。试试cronmaker.com
  • 你用过grails石英插件了吗?
【解决方案3】:

这是文档所说的

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

希望有帮助

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-25
    • 2011-11-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多