spring的定时任务有以下两个特性:
1、单定时任务之间是串行,之前的任务没执行完,下一个任务不会启动。
2、多个任务之间会相互干扰,其他同一时刻启动的任务没执行完,下一个任务不会启动。
排查方式:
1、首先检查自己的代码,是否有死锁、卡住、bug、http请求没有设置超时时间等问题。
2、检查是否所有定时任务都不启动,如果是基本判断是特性2导致的,检查是哪个定时任务执行慢、卡住、出现bug等情况。
解决思路:
1、修复bug,如果有的话。
2、如果就是有个任务执行慢,无法优化,可以不用spring的定时任务,改用Quartz。
依赖包
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.2.1</version>
</dependency>
配置:
<!-- 工作的bean -->
<bean id="myJob" class=" com.gionee.baserom.exchangerate.job.DailyTaskJob" />
<!-- 定义任务,为了避免线程阻塞,用concurrent=false -->
<bean id="myJobDetail"
class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject" ref="myJob" />
<property name="targetMethod" value="execute" />
<property name="concurrent" value="false" />
</bean>
<!-- 配置触发器 -->
<bean id="myJobTrigger"
class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<property name="jobDetail" ref="myJobDetail" />
<property name="cronExpression" value="0 0/30 * * * ?" />
</bean>
<!-- 配置调度器 -->
<bean name="startQuertz" lazy-init="false" autowire="no" destroy-method="destroy"
class="com.gionee.baserom.exchangerate.util.SchedulerFactoryBeanWithShutdownDelay" >
<property name="quartzProperties">
<props>
<prop key="org.quartz.threadPool.threadCount">1</prop>
</props>
</property>
<property name="waitForJobsToCompleteOnShutdown">
<value>false</value>
</property>
<property name="triggers">
<list>
<ref bean="myJobTrigger" />
</list>
</property>
</bean>
代码摘自: