Spring 定时任务

使用Spring定时任务

<?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:task="http://www.springframework.org/schema/task"
       xsi:schemaLocation="http://www.springframework.org/schema/beans 
        http://www.springframework.org/schema/beans/spring-beans.xsd 
        http://www.springframework.org/schema/task 
        http://www.springframework.org/schema/task/spring-task-3.0.xsd">

    <bean id="springScheduledTask" class="org.alpha.SpringScheduledTask" />
    <task:scheduled-tasks>
        <task:scheduled ref="springScheduledTask" method="startCollect" cron="${sampling.time}"/>
        <task:scheduled ref="springScheduledTask" method="startManage" cron="${manage.time}"/>
        <task:scheduled ref="springScheduledTask" method="startTakeSnapshot" cron="${snapshot.time}"/>
    </task:scheduled-tasks>

    <task:scheduler id="myScheduler" pool-size="5"/>
    <task:annotation-driven scheduler="myScheduler"/> 

    <!--<task:annotation-driven />-->
</beans>

除了可以在task:scheduled标签中指定调度时间属性cron之外,也可以在方法上使用@Scheduled注解,指定调度时间cron。

@Component  // import org.springframework.stereotype.Component
public class SpringScheduledTask implements ISpringScheduledTask {
      @Scheduled(cron="0/5 * *  * * ? ")   // 每5秒执行一次
      @Override
      public void startCollect() { 
          System.out.println("Enter startCollect ...");
      }
}

使用Spring定时任务时,需要注意的是:

  • 实现类上要有组件的注解@Component
  • Spring的@Scheduled注解需要写在实现上
  • 定时器的任务方法不能有返回值,如果有返回值,spring初始化时会报错
  • corn表达式
  • 推荐配置定时任务的线程池,Spring的定时任务默认是单线程,多个任务执行起来时间会有问题,B任务会因为A任务执行起来需要20S而被延后20S执行

results matching ""

    No results matching ""