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() {
}
}