Java 石英弹簧CronTrigger触发次数超过配置次数
我有一个作业“digestJob”的cronTrigger:Java 石英弹簧CronTrigger触发次数超过配置次数,java,spring,quartz-scheduler,crontrigger,Java,Spring,Quartz Scheduler,Crontrigger,我有一个作业“digestJob”的cronTrigger: 以下是我的schedulerFactoryBean配置: <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <property name="triggers"> <list> <ref bean="digestCronTr
以下是我的schedulerFactoryBean配置:
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="digestCronTrigger" />
</list>
</property>
</bean>
问题是,digestCronTrigger应该在每天下午5:35发射一次,但在指定时间发射两次。但是,当我使用SimpleTrigger时:
<bean id="digestTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean">
<property name="jobDetail" ref="digestJob" />
<property name="startDelay" value="0" />
<property name="repeatInterval" value="10000" />
</bean>
一切正常,每10秒触发一次。为什么触发两次?我的cron表达式是否有问题,或者是否缺少任何属性?任何帮助都将不胜感激。试试以下方法:
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="cronTrigger" />
</list>
</property>
</bean>
<bean id="jobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject" ref="actionObject" />
<property name="targetMethod" value="actionMethod" />
</bean>
<bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail" ref="jobDetail"/>
<property name="cronExpression" value="0 15 17 * * ?"/>
</bean>
我在那里发布了帮助,以找出问题背后的原因:
我加载了两次应用程序上下文。后来我发现了如何避免两次加载上下文。现在一切正常。如果在启动应用程序并使用quartz.properties文件中的数据源时创建触发器,也会发生这种情况。每次启动服务器时,它都会向
QRTZ\u CRON\u触发器
和QRTZ\u触发器
表写入一个新触发器,并在每次重新启动时使用所有这些触发器。我也有这个问题,我们最终找到了根本原因。
我们的服务器Tomcat设置中存在一些问题,/…/Tomcat/conf/server.xml
我们的
server.xml
如下所示,同一个tomcat中有2个
定期运行同一个cronJob,但同时写入同一个日志文件和数据库,因此它按计划启动两次,但如果我们手动运行cronJob,它只启动一次。。。
当然,解决方案是删除一个主机,希望这有帮助
...
...
对于下午5:35,正确的cron表达式将是(0 35 17**?),除此之外,cron表达式是完美的。我不在乎这条评论是否会被标记为“太健谈”,我反对我的诚信,因为我为此提出了很多标记。伙计,你救了我一天。工匠,帖子的结尾是“我遇到了这个问题。你能发布你的解决方案吗?谢谢。”。你的最终解决方案是什么?你如何避免这种情况?我通过确保我的工作和触发器有一个名称来避免这种情况。如果不设置此属性,则在应用程序每次启动时都会添加新的触发器。
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="cronTrigger" />
</list>
</property>
</bean>
<bean id="jobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject" ref="actionObject" />
<property name="targetMethod" value="actionMethod" />
</bean>
<bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail" ref="jobDetail"/>
<property name="cronExpression" value="0 15 17 * * ?"/>
</bean>
<Server port="8005" shutdown="SHUTDOWN">
...
<Service name="Catalina">
...
<Engine name="Catalina" defaultHost="localhost">
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log." suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
<Host name="<domain_name>" appBase="webapps" unpackWARs="true" autoDeploy="true">
<Alias><domain_name></Alias>
<Valve className="org.apache.catalina.valves.AccessLogValve"
directory="logs" prefix="localhost_access_log." suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" resolveHosts="false" />
</Host>
</Engine>
</Service>
</Server>