Spring Scheduler 使用教程

3,479 阅读3分钟

1. Spring Scheduler

Spring Scheduler是Spring提供的一个任务调度框架,它是基于org.springframework.scheduling.TaskScheduler接口实现的。它目前有四个实现类,但我们常用的是org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler。另外还有一个重要的接口org.springframework.scheduling.Trigger,这个接口是触发器,也就是我们用来定义任务执行时间的。Spring Scheduler的本质其实就是申明了一个线程池,然后定时异步的调用我们的任务。

1.基于xml文件

我们可以通过xml文件,来申明我们的ThreadPoolTaskScheduler线程池以及任务,配置如下。

<!--申明Scheduler的异常处理方式,org.springframework.util.ErrorHandler-->
<bean id="loggingErrorHandler" 						class="org.springframework.scheduling.support.TaskUtils.LoggingErrorHandler"/>

<!--定义Scheduler线程池-->
<bean id="taskScheduler" class="org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler">
        <!--线程数量-->
        <property name="poolSize" value="5"/>
        <!--异常处理-->
        <property name="errorHandler" ref="loggingErrorHandler"/>
</bean>

<!--定义Trigger触发器,org.springframework.scheduling.Trigger
	这里触发器有两种:CronTrigger、PeriodicTrigger,但我们常用的是CronTrigger,也就cron expression-->
    <bean id="cronTrigger" class="org.springframework.scheduling.support.CronTrigger">
        <constructor-arg name="expression" value="* */1 * * ?"/>
    </bean>

<!--
        XML的配置
        对于有相同scheduler的任务,可以使用该标签同时配置
        scheduler:指定某个ThreadPoolTaskScheduler
        -->
<task:scheduled-tasks scheduler="taskScheduler">
    <!--
            ref:bean name
            method:执行的方法
            fixed-delay:延迟执行时间 单位:ms
            fixed-rate:固定速率 单位:ms
            initial-delay:初始化延迟时间 单位:ms
            cron:cron expression
            trigger:trigger bean name 触发器 如CronTrigger、PeriodicTrigger
            -->
    <task:scheduled ref="beanA" 
                    method="methodA"
                    fixed-delay="2000" 
                    fixed-rate="2000" 
                    initial-delay="1000"
                    cron="* */1 * * ?" 
                    trigger="cronTrigger"/>
    <task:scheduled ref="beanB" method="methodB"/>
</task:scheduled-tasks>

使用xml形式来支持@Scheduled注解,有点类似于<mvc:anntation-driven/>,都是开启注解支持。

<!--
        id:线程池名称,池中线程的名称前缀 ThreadPoolTaskScheduler
	    pool-size:线程数量
        -->
    <task:scheduler id="myScheduler" pool-size="10"/>

<!--
        该标签是用于开启@Scheduled注解模式的	
	    等价于@EnableScheduling
        scheduler:scheduler bean name
        exception-handler:ThreadPoolTaskExecutor exception handler bean name
        mode:代理方式 1.AspectJ 2.JDK Proxy  默认JDK Proxy
        proxy-target-class:是否代理目标类 默认false
        -->
    <task:annotation-driven scheduler="myScheduler"/>

2.基于java config

基于java config 的配置方式通过implement org.springframework.scheduling.annotation.SchedulingConfigurer 方式来实现的,具体配置如下。

@Configuration
public class MySchedulingConfigure implements SchedulingConfigurer {
    @Override
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
//        taskRegistrar.setScheduler("taskScheduler");
        taskRegistrar.setTaskScheduler(taskScheduler());
        taskRegistrar.addCronTask(task(), "* */1 * * ?");
    }

    /**
     * 配置线程池
     * @return
     */
    @Bean(value = "taskScheduler")
    public TaskScheduler taskScheduler() {
        ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
        scheduler.setPoolSize(10);
        return scheduler;
    }

    /**
     * 任务,implements Runnable或extends CoreTask 
     * @return
     */
    public MyTask task() {
        return new MyTask();
    }
}

3.基于注解

Spring Scheduler基于注解的方式,主要使用到了两个注解:@EnableScheduling@Scheduled@EnableScheduling意思是该应用允许开启任务调度,一般和@Configuration注解一起作用在配置类上;@Scheduled作用在方法上,表示该方法是一个任务。

@Configuration
@EnableScheduling //开启任务调度,相当于TaskScheduler
public class MyConfiguration {

    /**
     * 配置线程池
     * 如果不配置,@EnableScheduling默认pool-size=1
     *
     * @return
     */
    @Bean
    public TaskScheduler taskScheduler() {
        ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
        scheduler.setPoolSize(10);
        return scheduler;
    }
}


public class MySchedule {

    /**
     * 注意:被注解的方法不能有入参和返回值,因为它是交给IOC容器管理的,不像@Async,是通过请求
     * 属性:
     * cron:cron expression
     * zone:时区,可用于国际化
     * fixedDelay:固定延迟,单位:ms
     * fixedDelayString:固定延迟,字符串,单位:ms
     * fixedRate:固定速率,单位:ms
     * fixedRateString:固定速率,字符串,单位:ms
     * initialDelay:初始化延迟,单位:ms
     * initialDelayString:初始化延迟,字符串,单位:ms
     */
    @Scheduled(cron = "* */1 * * ?")
    public void schedule() {

    }
}

spring官方文档