任务调度的实现:
- Java自带的java.util.Timer类,这个类允许你调度一个java.util.TimerTask任务。使用这种方式可以让你的程序按照某一个频度执行,但不能在指定时间运行。
- 使用Quartz,这是一个功能比较强大的的调度器,可以让你的程序在指定时间执行,也可以按照某一个频度执行。
- Spring3.0以后自带的task,可以将它看成一个轻量级的Quartz,而且使用起来比Quartz简单许多。
所需jar包:
quartz-1.8.5.jar
commons-logging.jar
spring-core-3.0.5.RELEASE.jar
spring-beans-3.0.5.RELEASE.jar
spring-context-3.0.5.RELEASE.jar
spring-context-support-3.0.5.RELEASE.jar
spring-asm-3.0.5.RELEASE.jar
spring-expression-3.0.5.RELEASE.jar
spring.transaction-3.0.5.RELEASE.jar
spring-web-3.0.5.RELEASE.jar
Maven的pom.xml的配置:
<properties>
<springframework.version>3.0.5.RELEASE</springframework.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${springframework.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${springframework.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${springframework.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${springframework.version}</version>
</dependency>
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>1.8.5</version>
</dependency>
</dependencies>
Spring为Quartz提供了两个方面的支持:
1、为Quartz的重要组件类提供更具Bean风格的扩展类;
2、提供创建Scheduler的BeanFactory类,方便在Spring环境下创建对应的组件对象,并结合Spring
容器生命周期进行启动和停止的动作。
在web.xml中配置spring:
<!-- srping配置 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<!-- 配置spring监听器 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
在applicationContext,xml中配置quartz
<!-- Quartz任务调度器 -->
<!-- 使用MethodInvokingJobDetailFactoryBean,任务类不需要实现Dao接口,可以通过targetMethod指定调用的方法 -->
<bean name="luceneJob" class="com.xuzengqiang.design.core.lucene.quartz.LuceneQuartz" />
<bean id="quartzMethod"
class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject" ref="luceneJob" />
<property name="targetMethod" value="execute" /> <!-- 任务方法 -->
</bean>
<!-- 创建触发器Trigger -->
<bean id="luceneTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail" ref="quartzMethod" />
<property name="cronExpression" value="0/5 * * * * ?" /> <!-- 每5s触发一次 -->
</bean>
<!-- Scheduler调度工厂 -->
<bean id="luceneScheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="luceneTrigger" />
</list>
</property>
</bean>
测试 java类:
package com.xuzengqiang.design.core.lucene.quartz;
/**
* Lucene任务调度
*
* @author xuzengqiang
* @since 2014-11-14
*
*/
public class LuceneQuartz {
// 任务调度器统计工具
private static int count = 1;
protected void execute() {
System.out.println("count:" + (count++));
}
}
方法二:使用Spring自带的Task,使用注解方式
编写调度类:
package com.vnetoo.redu.common.lucene.quartz;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
/**
* Lucene新增索引的任务调度器:利用spring实现
* 实现类需要加上@Component
* 在任务调度方法加上@Scheduled
*
* @author xuzengqiang
* @since 2014-11-14 每隔5min分钟查询一次Task任务表,并将其加入索引
*/
@Component
public class IndexTask {
private static Integer count = 1;
/**
* scheduled:每5分钟刷新一次
* 定时器任务不能有返回值
*/
@Scheduled(cron = "0 0/5 * * * *")
public void execute() {
System.out.println(count++);
}
}
添加task相关配置(需要加上命名空间:xmlns:task="http://www.springframework.org/schema/task" 然后加上描述:spring-task-3.0.xsd)
<?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:tx="http://www.springframework.org/schema/tx"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:task="http://www.springframework.org/schema/task"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-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/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.0.xsd">
<!-- spring的扫描机制,对com.manager下的所有类扫描 -->
<context:component-scan base-package="com.vnetoo.redu" />
<task:executor id="executor" pool-size="5" />
<!-- 声明一个具有10个线程的池,每一个对象将获取同样的运行机会 -->
<task:scheduler id="scheduler" pool-size="10" />
<task:annotation-driven executor="executor" scheduler="scheduler" />
</beans>