quartz重复执行的问题

IngloriousBasterds 2016-02-17 04:54:16
最近用到quartz做集群,需求每隔一段时间执行一次任务。
发现在配置较短的时间间隔,比如15秒钟执行一次时,会出现,服务器启动会有多个线程(不等,有时候2个,多的时候4个,quartz线程数目用的默认的10个)重复执行该任务。
控制台信息如下:

而当我配置成1min执行一次的时候,就没有问题,不会重发执行。
主要的配置文件如下,求解,感谢感谢。

<bean id="autoRepeatRequestTask"
class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
<property name="jobClass">
<value>com..job.AutoRequestRepeatJob</value>
</property>
<property name="durability" value="true" />
<property name="requestsRecovery" value="true" />
</bean>
<!-- 定义触发时间 -->
<bean id="autoRepeatRequestDoTime"
class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<property name="jobDetail">
<ref bean="autoRepeatRequestTask" />
</property>
<!-- cron表达式 -->
<property name="cronExpression">
<value>0 * * * * ?</value>
<!--每分钟执行一次 -->
</property>
</bean>
<!-- 总管理类 如果将lazy-init='false'那么容器启动就会执行调度程序 -->
<bean id="startQuartz" lazy-init="false" autowire="no"
class="org.springframework.scheduling.quartz.SchedulerFactoryBean"
destroy-method="destroy">
<property name="configLocation" value="classpath:quartz.properties" />
<property name="triggers">
<list>
<ref bean="autoRepeatRequestDoTime" />
</list>
</property>
<property name="startupDelay" value="10" />
<property name="applicationContextSchedulerContextKey" value="applicationContextKey" />
</bean>

执行的任务类:

@PersistJobDataAfterExecution
@DisallowConcurrentExecution // 不允许并发执行
public class AutoRequestRepeatJob extends QuartzJobBean {
private static final Logger LOGGER = LoggerFactory.getLogger(AutoRequestRepeatJob.class);

@Override
protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
System.out.println(Thread.currentThread().getName()+"------初始化了"+DateTimeUtils.getNowHHmmss());
RequestRepeatService requestRepeatService = getApplicationContext(context).getBean(RequestRepeatService.class);
requestRepeatService.autoRepeatRequest();

}

private ApplicationContext getApplicationContext(final JobExecutionContext jobexecutioncontext) {
try {
return (ApplicationContext) jobexecutioncontext.getScheduler().getContext().get("applicationContextKey");
} catch (SchedulerException e) {
LOGGER.error("jobexecutioncontext.getScheduler().getContext() error!", e);
throw new RuntimeException(e);
}
}

}
...全文
1445 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
代码尘埃 2017-09-18
  • 打赏
  • 举报
回复
厉害了
  • 打赏
  • 举报
回复
引用 3 楼 qq_17858533 的回复:
研究出来了,当时做集群配置quartz.properties,照着网上的资料设置的org.quartz.jobStore.misfireThreshold = 60000 这个东西设置了以后就是超时1min的就不执行,小于1min会立即执行 我设置15s的情况下,如果我在10:00:00执行了一个任务,下次就是15s,但是如果服务器挂掉,我在10:00:50重新启动服务器,由于任务间隔是15s,所以从00-50s中间会有三个任务超时没有执行(本来应该分别是在15s,30s,45s执行),而超时的时间均小于1min,所以服务器启动以后会立即开启三个quartz线程来执行超时的任务。 如果设置1min,无论如何超时,都是超过1min的,所以不会执行超时任务。 终于解决了
厉害!
IngloriousBasterds 2016-02-18
  • 打赏
  • 举报
回复
引用 2 楼 shijing266 的回复:
可以参考下时间的配置
研究出来了,当时做集群配置quartz.properties,照着网上的资料设置的org.quartz.jobStore.misfireThreshold = 60000 这个东西设置了以后就是超时1min的就不执行,小于1min会立即执行 我设置15s的情况下,如果我在10:00:00执行了一个任务,下次就是15s,但是如果服务器挂掉,我在10:00:50重新启动服务器,由于任务间隔是15s,所以从00-50s中间会有三个任务超时没有执行(本来应该分别是在15s,30s,45s执行),而超时的时间均小于1min,所以服务器启动以后会立即开启三个quartz线程来执行超时的任务。 如果设置1min,无论如何超时,都是超过1min的,所以不会执行超时任务。 终于解决了
IngloriousBasterds 2016-02-17
  • 打赏
  • 举报
回复


正常的应该是这样的,但是还是有点小问题,可以看到第一次执行的时间并不是整点,不知道是不是因为startupDelay设置了10s延迟的原因

81,122

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧