Spring3.0以后引入的定时任务工具:spring task,可以将它比作一个轻量级的Quartz,而且使用起来很简单,除spring相关的包外不需要额外的包,而且支持注解和配置文件两种。spring通过接口TaskExecutor和TaskScheduler这两个接口的方式为异步定时任务提供了一种抽象。
XML配置
Spring提供了task命名空间,让配置定时任务非常简单。
|
|
说明:ref参数指定的即任务类,method指定的即需要运行的方法,cron指定cronExpression表达式
注意:<task:schedule-tasks scheduler="scheduler"> 这里的scheduler必须显式指定,否则它只会使用默认的值,默认为单线程的。
任务Job
|
|
TaskExecutor
|
|
task:executor会注册一个ThreadPoolTaskExecutor执行器,可以使用它的相关属性来配置该执行器。
|
|
pool-size:线程池大小,如果只是设置了一个值。则corePoolsize和maxPoolSize都是这个值。queue-capacity:队列大小rejection-policy: 队列满的时候,使用的拒绝策略。
拒绝策略有:
ABORT(默认):抛出TaskRejectedException异常,然后不执行DISCARD:不执行,也不抛出异常DISCARD_OLDEST:丢弃queue中最旧的那个任务CALLER_RUNS:不在新线程中执行任务,而是由调用者所在的线程来执行
|
|
默认情况下执行队列是无限的,可能会导致JVM使用完所有内存,因此最好指定一个确定的数值。
TaskScheduler
|
|
task:scheduler会注册一个ThreadPoolTaskScheduler 定时器,它只有一个属性线程池大小。默认是1,我们需要根据任务的数量指定一个合适的大小。
|
|
TaskScheduler就是为了提供定时任务的支持。TaskScheduler需要传入一个Runnable的任务做为参数,并指定需要周期执行的时间或者触发器,这样Runnable任务就可以周期性执行了。
ThreadPoolTaskScheduler实际上代理了jdk中的SchedulingTaskExecutor,并且也实现了TaskScheduler接口,所以一个ThreadPoolTaskScheduler实例即可同时用于执行定时任务(任务调度和执行都是该线程池)。
|
|
执行任务
使用<task:scheduled-tasks>指定要执行的Bean和方法即可执行任务。
|
|
使用注解
@Schedule:调度任务
从spring 2.5开始,可以方便的使用注解来声明bean,对于定时任务,同样提供了注解@Scheduled
|
|
cron:指定cron表达式fixedDelay:表示从上一个任务完成开始到下一个任务开始的间隔,单位是毫秒。fixedRate:表示从上一个任务开始到下一个任务开始的间隔,单位是毫秒。
注解配置
|
|
proxy-target-class="true":表示使用cglib代理
任务Job
|
|
@Schedule注解表示该任务既由ThreadPoolTaskScheduler调度同时也有该线程池执行(与上面的xml配置作用相同)
@Async:异步任务
对于异步任务,可以使用注解@Async:
|
|
可以在注解的地方指定任务执行的线程池(作用与executor="executor"相同),方式:@Async("executor")
注解配置
|
|
任务Job
|
|
同时使用@Schedule @Async
有时候执行任务需要的时间比较长,可以让scheduler只做调度,而让 executor 来执行我们的任务
注解配置
|
|
注意:上述XML配置信息,其中处理任务的executor引用配置,相当于@Async注解;管理任务的Scheduler相当于@Scheduled注解。
任务Job
|
|
这样子,execute的方法,就会由executor 线程池来执行了。