Spring3.0以后自主开发的定时任务工具,spring task,可以将它比作一个轻量级的Quartz,使用起来很简单,除spring相关的包外不需要额外的包,而且支持注解和配置文件两种.
1.在spring配置文件头中添加命名空间及描述:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:jdbc="http://www.springframework.org/schema/jdbc" xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:mvc="http://www.springframework.org/schema/mvc"
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/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/jdbc
http://www.springframework.org/schema/jdbc/spring-jdbc-3.0.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd
http://www.springframework.org/schema/task
http://www.springframework.org/schema/task/spring-task-3.0.xsd "
default-autowire="byName">
2.spring配置文件中设置具体的任务
<context:annotation-config />
<context:component-scan base-package="com." />
<task:scheduled-tasks>
<task:scheduled ref="taskJob" method="job1" cron="0/10 * * * * ?"/>
</task:scheduled-tasks>
<bean id="taskJob" class="com..TaskJob"></bean>
OK,设置完成.
3.测试类
public class TaskJob {
public void job1() {
System.out.println(Thread.currentThread().getName()+" "+"任务进行中");
}
}
4.
如果还想扩展一下,改成下面这样:
<task:executor id="executor" pool-size="5" />
<task:scheduler id="scheduler" pool-size="5" />
<task:annotation-driven executor="executor" scheduler="scheduler" />
如果定时任务很多,可以配置executor线程池,这里executor的含义和java.util.concurrent.Executor是一样的,pool-size的大小官方推荐为5~10。scheduler的pool-size是ScheduledExecutorService线程池,默认为1。假如我设置了多个任务,每个任务都是每10秒钟执行一次,
线程名称都是以scheduler为前缀,这是因为我们已经在<task:scheduler id="scheduler" pool-size="5" />这段配置里定义了id为scheduler的结果,它就是用来作为任务线程的前缀,再交给executor线程池进行。
3次任务执行,因为我们设定的任务调度线程池大小为5,所以,只有5个实例来处理这8个任务,从结果可以看出来,不是每次都会用上全部的5个实例。如果你系统中的定时任务过多,这个pool-size的大小就应该调大一点,方便之前定义的executor线程池来执行。
CRON表达式
"0 0 12 * * ?" 每天中午十二点触发
"0 15 10 ? * *" 每天早上10:15触发
"0 15 10 * * ?" 每天早上10:15触发
"0 15 10 * * ? *" 每天早上10:15触发
"0 15 10 * * ? 2005" 2005年的每天早上10:15触发
"0 * 14 * * ?" 每天从下午2点开始到2点59分每分钟一次触发
"0 0/5 14 * * ?" 每天从下午2点开始到2:55分结束每5分钟一次触发
"0 0/5 14,18 * * ?" 每天的下午2点至2:55和6点至6点55分两个时间段内每5分钟一次触发
"0 0-5 14 * * ?" 每天14:00至14:05每分钟一次触发
"0 10,44 14 ? 3 WED" 三月的每周三的14:10和14:44触发
"0 15 10 ? * MON-FRI" 每个周一、周二、周三、周四、周五的10:15触发