Spring quartz 使用中的定时器,停滞问题

来源:互联网 发布:淘宝买家账号钻石级别 编辑:程序博客网 时间:2024/05/17 02:57

在spring中使用quartz,碰到定时器卡死,实际上并不是定时器卡死,而且上次任务没有退出。

项目中,单独建了一个文件管理quartz的配置 

applicationContext-quartz.xml


<?xml version="1.0" encoding="UTF-8"?>
<beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:task="http://www.springframework.org/schema/task"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
   http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task.xsd">


trigger <!-- 调度工厂 -->

 <bean id="scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
      <property name="triggers">
        <list>
          <ref bean="everyTenSeconds"/>
        </list>
      </property>
    </bean>


 <!--  调度触发器 -->
   <bean id="everyTenSeconds" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
      <property name="jobDetail">
        <ref bean="tenSecJob" />
      </property>
      <property name="cronExpression">
        <value>*/10 * * * * ?</value>
      </property>
    </bean>


<bean id="tenSecJobTask" class="com.gaode.dike.task.tenSecJobTask"/>

<bean id="tenSecJob" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
      <property name="group" value="tenSecJob_group"/>
      <property name="name" value="tenSecJob_name"/>
      <property name="concurrent" value="false"/>
      <property name="targetObject">
 <ref bean="tenSecJobTask"/>
      </property>
      <property name="targetMethod">
        <value>tenSecs</value>
      </property>
 </bean>


***   false 代表,上次一次任务结束,下一次才执行,这也是卡死的原因之一

  <property name="concurrent" value="false"/>


public class ScheduleTask {

    public void tenSecs(){
    logger.info(" -----  tenSecs------ ");
 
        // 任务执行,不退出       
        logger.info(" -- END --  !!!! ScanOneHourTask !!!!--- ");
    }


}



由于上次任务没有退出,造成定时器定制,下次任务没有触发


任务没有退出,原因有几种

1. 线程死锁 (jstack 查看)

2. 网络链接超时不退出 (一定要设置网络超时timeout,和重试机制),数据库链接也要设置timeout,避免链接死锁

3. 运算任务超长,CPU,内存不够



原创粉丝点击