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
线程池来执行了。