目前spring的最新版本是4.2.5,通过对spring scheduling的学习,总结有几种可以实现调度任务的方式
1、注解
2、Task命名空间
3、使用Quartz调度
下面分别介绍实现方式
首先引入相关jar包,pom.xml中配置:
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.3</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>4.2.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.2.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>4.2.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>4.2.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.2.2</version>
</dependency>
web.xml中配置加载spring:
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<display-name>Archetype Created Web Application</display-name>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-config.xml</param-value>
</context-param>
</web-app>
1、使用注解的方式开始调度任务
配置java类
<pre style="background-color:#2b2b2b;color:#a9b7c6;font-family:'宋体';font-size:11.3pt;"><span style="color:#cc7832;">package </span>test.spring.scheduling.annotation<span style="color:#cc7832;">;
</span><span style="color:#cc7832;">
</span><span style="color:#cc7832;">import </span><span style="color:#bbb529;">org.springframework.context.annotation.Configuration</span><span style="color:#cc7832;">;
</span><span style="color:#cc7832;">import </span><span style="color:#bbb529;">org.springframework.scheduling.annotation.EnableScheduling</span><span style="color:#cc7832;">;
</span><span style="color:#cc7832;">import </span><span style="color:#bbb529;">org.springframework.scheduling.annotation.Scheduled</span><span style="color:#cc7832;">;
</span><span style="color:#cc7832;">
</span><span style="color:#cc7832;">import </span>java.util.Date<span style="color:#cc7832;">;
</span><span style="color:#629755;font-style:italic;">
</span><span style="color:#bbb529;">@Configuration
</span><span style="color:#bbb529;">@EnableScheduling
</span><span style="color:#cc7832;">public class </span>AnnotationScheduleService {
<span style="color:#bbb529;">@Scheduled</span>(<span style="color:#d0d0ff;">cron </span>= <span style="color:#6a8759;">"0/5 * * * * ?"</span>)
<span style="color:#cc7832;">public void </span><span style="color:#ffc66d;">test</span>(){
System.<span style="color:#9876aa;font-style:italic;">out</span>.println(<span style="color:#cc7832;">new </span>Date())<span style="color:#cc7832;">;
</span><span style="color:#cc7832;"> </span>}
}
配置spring.xml
<?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:task="http://www.springframework.org/schema/task"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<context:component-scan base-package="test.spring.scheduling.annotation"/>
<task:scheduler id="myAnnotationScheduler" pool-size="10"/>
<task:annotation-driven scheduler="myAnnotationScheduler"/>
</beans>
2、使用task命名空间运行schedule
java类
package test.spring.scheduling.tasknamespace;
import java.util.Date;
/**
* Created by yuan on 2016/3/12.
*/
public class TaskNamespaceScheduleService {
public void test(){
System.out.println("TaskNamespaceScheduleService "+new Date());
}
}
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: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/task http://www.springframework.org/schema/task/spring-task.xsd">
<bean id="taskNamespaceScheduleService" class="test.spring.scheduling.tasknamespace.TaskNamespaceScheduleService"/>
<task:scheduled-tasks>
<task:scheduled ref="taskNamespaceScheduleService" method="test" cron="*/5 * * * * ?"/>
</task:scheduled-tasks>
</beans>
或者:
<?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: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/task http://www.springframework.org/schema/task/spring-task.xsd">
<bean id="taskNamespaceScheduleService" class="test.spring.scheduling.tasknamespace.TaskNamespaceScheduleService"/>
<task:scheduler id="myTaskNamespaceScheduler" pool-size="10"/>
<task:scheduled-tasks scheduler="myTaskNamespaceScheduler">
<task:scheduled ref="taskNamespaceScheduleService" method="test" cron="*/5 * * * * ?"/>
</task:scheduled-tasks>
</beans>
3、使用Quartz调度schedule
分别使用JobDetailFactoryBean和MethodInvokingJobDetailFactoryBean配置调度任务
package test.spring.scheduling.quartz;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.scheduling.quartz.QuartzJobBean;
import java.util.Date;
/**
* Created by yuan on 2016/3/12.
*/
public class QuartzOne extends QuartzJobBean {
/**
* Execute the actual job. The job data map will already have been
* applied as bean property values by execute. The contract is
* exactly the same as for the standard Quartz execute method.
*
* @param context
* @see #execute
*/
@Override
protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
System.out.println("QuartzOne "+new Date());
}
}
package test.spring.scheduling.quartz;
import java.util.Date;
/**
* Created by yuan on 2016/3/12.
*/
public class QuartzTwo {
public void test(){
System.out.println("QuartzTwo "+new Date());
}
}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 使用JobDetailFactoryBean -->
<bean name="quartzOneJob" class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
<property name="jobClass" value="test.spring.scheduling.quartz.QuartzOne"/>
</bean>
<!-- 使用MethodInvokingJobDetailFactoryBean -->
<bean id="quartzTwoBean" class="test.spring.scheduling.quartz.QuartzTwo"/>
<bean name="quartzTwoJob" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject" ref="quartzTwoBean"/>
<property name="targetMethod" value="test"/>
</bean>
<!-- 配置trigger -->
<bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean">
<!-- see the example of method invoking job above -->
<property name="jobDetail" ref="quartzOneJob"/>
<!-- 10 seconds -->
<property name="startDelay" value="10000"/>
<!-- repeat every 11 seconds -->
<property name="repeatInterval" value="11000"/>
</bean>
<bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<property name="jobDetail" ref="quartzTwoJob"/>
<!-- 每5秒执行一次 -->
<property name="cronExpression" value="0/5 * * * * ?"/>
</bean>
<!-- 配置SchedulerFactoryBean -->
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="cronTrigger"/>
<ref bean="simpleTrigger"/>
</list>
</property>
</bean>
</beans>
参考:spring官方文档 http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/#scheduling-quartz-method-invoking-job