2013-04-08 45 views
5

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

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

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和石英-1.0-RC6

+0

你在哪里托管它?我遇到过类似的问题... – marko 2013-04-08 07:00:23

+0

该应用是否安装在一台应用服务器上? – 2013-04-08 12:38:39

+0

我在Vim的Rimuhosting.com上托管它。该应用程序只安装在一个tomcat中 – 2013-04-09 07:06:51

回答

2

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

+0

我添加了一个deployOnStartup =“false” autoDeploy =“false”,今天它只触发两次。难道是因为我的战争和目录在$ CATALINA_HOME/webapps – 2013-04-29 09:38:40

+0

下是的,这可以解释它。我相信这种行为还取决于你的应用程序的'Context'是如何定义的(例如,在'conf \ Catalina \ localhost'下的'.xml'文件中的'server.xml'?中)。无论如何,试着移动你的.war文件脱离webapps;我相信这会有所帮助。 – 2013-04-29 14:31:23

+0

我有同样的问题,我不确定这是否是原因。我的工作总是触发*三次*。为什么不*两个*或*四个*? @SergiodelAmo – 2016-04-15 10:38:25

1

这就是文档说

要么Day- of-Week或Day-of-Month必须是“?”,否则由于底层库的支持不完整,您将会收到错误。所以你不能指定两个字段,也不能同时保留所有的值为通配符“*”;这是unix crontab规范的一个偏离。

希望帮助下面分析

2

编辑

的不在这种情况下保持良好。这只是一个基于原始误解事实的假设。如果建议,我可以删除答案。

END

我希望我能回答我自己的问题,我问的评论。

什么比早上7点触发其他都是时代?

是否上午7点14:009点

原因是:

  • 参见quartz插件[石英-1.0-RC6]它使用org.quartz-scheduler:quartz:1.8.4的版本。请参阅BuildConfig.groovy from Github
  • 跟着CronExpression API来自corressponding Javadoc

突出的重要措辞: -

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

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

quartz-scheduler.org这个最新的文档,否则说。看一看例子here。还研究了“特殊字符/”。

基于我对secondsminutes测试[我没有想等待24小时测试:)],我强烈认为下面的cronExpression会起作用并触发execute()正好7:00 Hrs每天:

答:

  1. "0 0 7/23 * * ?" [运行作业每24小时开始在第7小时零分钟和一天中的第0秒]
  2. "0 0 0/23,7 * * ?" [同义到答案1但较不详细。]

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

+0

它在三个不同的时间不会触发。它在7点触发在几秒钟内锐利三次 – 2013-04-29 09:35:52

+0

cron表达式是完美的,根据您提到的文档进行检查,请勿误导。 试试http://www.cronmaker.com/ – Kartikya 2013-04-30 07:14:43

+0

您是否使用过grails石英插件? – dmahapatro 2013-04-30 12:12:02