最近项目中需要使用到定时任务进行库存占用释放的需求,就总结了如何使用Spring Task进行简单配置完成该需求,本文介绍Spring3.0以后自定义开发的定时任务工具,
spring task,我们可以将它比作一个轻量级的Quartz,使用简单方便,除spring相关的包外不需要额外的包,而且支持注解和配置文件两种形式,下面我会分别介绍这两种方式。
开发环境
【1】.基于配置文件
1.编写普通java class
package com.hafiz.www.cron;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Desc:第一个基于SpringTask的调度任务
* Created by hafiz.zhang on 2016/12/11.
*/
public class FirstCron {
private static final Logger logger = LoggerFactory.getLogger(FirstCron.class);
public void cron() {
logger.info("定时任务进行中.......");
// do something else
}
}
2.在spring配置文件头中添加命名空间及描述(下面加粗处)并配置定时任务
1 <beans xmlns="http://www.springframework.org/schema/beans"
2 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
3 xmlns:task="http://www.springframework.org/schema/task"
4 xsi:schemaLocation="http://www.springframework.org/schema/beans
5 http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
6 http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task.xsd">
7
8 <bean id="firstCron" class="com.hafiz.www.cron.FirstCron"/>
9 <task:scheduled-tasks>
10 <task:scheduled ref="firstCron" method="cron" cron="0/5 * * * * ?"/>
11 </task:scheduled-tasks>
12 </beans>
我们设置每5秒钟运行一次。关于Spring Task 的 cron表达式,请参见另一篇博客:摆脱Spring 定时任务的@Scheduled cron表达式的困扰
【2】基于注解
我们可以使用@Scheduled注解进行开发,首先我们看下,该注解的源码
1 package org.springframework.scheduling.annotation;
2
3 import java.lang.annotation.Documented;
4 import java.lang.annotation.ElementType;
5 import java.lang.annotation.Repeatable;
6 import java.lang.annotation.Retention;
7 import java.lang.annotation.RetentionPolicy;
8 import java.lang.annotation.Target;
9 import org.springframework.scheduling.annotation.Schedules;
10
11 @Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE})
12 @Retention(RetentionPolicy.RUNTIME)
13 @Documented
14 @Repeatable(Schedules.class)
15 public @interface Scheduled {
16 String cron() default "";
17
18 String zone() default "";
19
20 long fixedDelay() default -1L;
21
22 String fixedDelayString() default "";
23
24 long fixedRate() default -1L;
25
26 String fixedRateString() default "";
27
28 long initialDelay() default -1L;
29
30 String initialDelayString() default "";
31 }
可以看出该注解有五个方法或者叫参数,分别表示的意思是:
fixedRate()
or fixedDelay()
task.任务第一次被调用前的延时,单位毫秒1.首先编写注解的定时任务类
1 package com.hafiz.www.cron;
2
3 import org.slf4j.Logger;
4 import org.slf4j.LoggerFactory;
5 import org.springframework.scheduling.annotation.Scheduled;
6
7 /**
8 * Desc:第一个基于SpringTask的调度任务
9 * Created by hafiz.zhang on 2016/12/11.
10 */
11 public class FirstCron {
12 private static final Logger logger = LoggerFactory.getLogger(FirstCron.class);
13
14 @Scheduled(cron = "0/5 * * * * ?")
15 public void cron() {
16 logger.info("定时任务进行中.......");
17 // do something else
18 }
19 }
2.在spring配置文件头中添加命名空间及描述(下面加粗处)并开启定时任务注解驱动
1 <beans xmlns="http://www.springframework.org/schema/beans"
2 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
3 xmlns:task="http://www.springframework.org/schema/task"
4 xsi:schemaLocation="http://www.springframework.org/schema/beans
5 http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
6 http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task.xsd">
7
8 <bean id="firstCron" class="com.hafiz.www.cron.FirstCron"/>
9 <task:scheduler id="qbScheduler" pool-size="10"/>
10 <task:annotation-driven scheduler="qbScheduler" mode="proxy"/>
11 <!--简单来说,我们只需要<task:annotation-driven/>这一句即可,这些参数不是必须的 -->
12 </beans>
以上我们就完成了基于注解的定时任务的开发,是不是很简单?
运行结果:
其实有些知识我们表面上看起来很难,但是当我们实际操作的时候,发现挺简单的,只要遇到问题我们勤思考多思考,就一定会有解决办法。关于定时任务,还有一种基于Spring Quartz的实现,以后有需要,我们再进行介绍。欢迎留言交流.......