一、定时任务概述
在项目中开发定时任务应该一种比较常见的需求了,在Java中开发定时任务主要有三种解决方案:1 使用JDK自带的Timer 2 使用第三方组件Quartz 3 使用Spring Task。Timer是JDK自带的定时任务工具,其简单易用,但是对于复杂的定时规则无法满足在实际项目开发中也很少使用到,Quartz功能强大但是使用起来相对笨重,而Spring Task则具备前两者的优点(功能强大且简单易用),在这篇博客中我将介绍如何使用Spring Task进行定时任务开发。
二、使用Spring Task实现定时任
Spring Task开发定时任务有两种任务配置方式:1 XML配置 2 注解配置。我将绍如何使用XML进行任务配置再介绍如何使用注解配置。
使用XML配置方式开发定时任务
- 创建Maven WEB项目
打开Eclipse创建maven WEB项目将开发所需要的jar的坐标配置在pom中。以下是我项目中的POM文件。
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.2.8.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>4.2.8.RELEASE</version>
</dependency>
</dependencies>
2 在webapp文件中创建WEB-INF并在该文件夹下添加web.xml文件,web.xml文件内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
id="WebApp_ID" version="2.5">
<display-name>springTask</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
</web-app>
3 在项目src目录下创建任务Service以及对应的实现类,代码对应如下:
public interface TaskService {
public void taskOne();
public void taskTwo();
}
public class TaskServiceImpl implements TaskService {
@Override
public void taskOne() {
System.out.println("这是我的第一个定时任务"+new Date());
}
@Override
public void taskTwo() {
System.out.println("这是我的第二个定时任务"+new Date());
}
}
4 在maven项目的resource目录下配置定时任务
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:c="http://www.springframework.org/schema/c"
xmlns:cache="http://www.springframework.org/schema/cache"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:jdbc="http://www.springframework.org/schema/jdbc"
xmlns:jee="http://www.springframework.org/schema/jee"
xmlns:lang="http://www.springframework.org/schema/lang"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:task="http://www.springframework.org/schema/task"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-4.3.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.3.xsd
http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-4.3.xsd
http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache-4.3.xsd
http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-4.3.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/lang http://www.springframework.org/schema/lang/spring-lang-4.3.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.3.xsd ">
<bean id="taskService"
class="com.wistronits.service.impl.TaskServiceImpl"></bean>
<!-- 配置定时规则 -->
<task:scheduled-tasks>
<!-- 表示在服务器启动一秒后执行任务1 并且每隔1秒钟执行一次-->
<task:scheduled ref="taskService" method="taskOne" initial-delay="1000" fixed-delay="1000" />
<!-- 表示在每天的13:40分0秒执行该任务->
<task:scheduled ref="taskService" method="taskTwo" cron="0 40 13 * * ?"/>
</task:scheduled-tasks>
</beans>
5 执行结果如下截图所示:
使用注解方式开发定时任务
使用注解方式开发定时任务与xml大体相同,不同于xml的差别如下:
1 在xml不在配置Spring管理的bean,而是配置Spring的包的扫描路径以及启用定时任务注解。
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:c="http://www.springframework.org/schema/c" xmlns:cache="http://www.springframework.org/schema/cache" xmlns:context="http://www.springframework.org/schema/context" xmlns:jdbc="http://www.springframework.org/schema/jdbc" xmlns:jee="http://www.springframework.org/schema/jee" xmlns:lang="http://www.springframework.org/schema/lang" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:p="http://www.springframework.org/schema/p" xmlns:task="http://www.springframework.org/schema/task" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:util="http://www.springframework.org/schema/util" xsi:schemaLocation="http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-4.3.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.3.xsd http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-4.3.xsd http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache-4.3.xsd http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-4.3.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/lang http://www.springframework.org/schema/lang/spring-lang-4.3.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.3.xsd "> <context:component-scan base-package="com.wistronits.service"></context:component-scan> <task:annotation-driven/> </beans>
@Service public class TaskServiceImpl implements TaskService { @Override//表示服务器启动两秒后启动该任务每隔一秒钟执行一次 @Scheduled(initialDelay=2000,fixedDelay=1000) public void taskOne() { System.out.println("这是我的第一个定时任务"+new Date()); } @Override @Scheduled(cron="*/5 * * * * ?")//每隔五秒钟执行一次 public void taskTwo() { System.out.println("这是我的第二个定时任务"+new Date()); } }
2 在需要进行定时任务的方法上中增加定时任务注解