spring+quartz实现定时调度

来源:互联网 发布:淘宝信用卡可以套现吗 编辑:程序博客网 时间:2024/06/07 20:49

spring+quartz实现任务调度在web应用启动时调度工厂就启动,web应用停止时,调度工厂也就停止工作,这种和web应用一致的声明周期很适合来实现任务调度,下面介绍使用方法。

(一)需要的jar包

需要包括两部分的jar包,一部分是quartz需要的jar包,包括:
c3p0-0.9.1.1.jar
log4j-1.2.16.jar
quartz-2.2.3.jar
quartz-jobs-2.2.3.jar
slf4j-api-1.7.7.jar
slf4j-log4j12-1.7.7.jar
因为涉及到了log4j,所以再加上一个日志jar包commons-logging-1.1.3.jar;
另一部分是spring需要的jar包,包括:
spring-beans-4.3.8.RELEASE.jar
spring-context-4.3.8.RELEASE.jar
spring-context-support-4.3.8.RELEASE.jar
spring-core-4.3.8.RELEASE.jar
spring-expression-4.3.8.RELEASE.jar
spring-tx-4.3.8.RELEASE.jar
spring-web-4.3.8.RELEASE.jar
quartz下载点击这里,spring下载点击这里。所需jar包截图如下所示:
这里写图片描述

(二)定义任务类

任务类可以是任何Java类,可以不用实现任何接口。例如下面是本人定一个名为MyJob的任务类,代码如下:

package controller;public class MyJob {    public void myJob(){        System.out.println("测试quartz!!!");    }}

(三)配置quartz

在java项目的src目录下新建一个.xml文件,命名为application.xml(文件名可以随便取),然后在里面配置quartz所需要的bean。
1.配置任务类
只需要定义一个bean,bean的class指向是设计的任务类。

2.配置调度任务
在配置调度任务时,需要指定调度的任务对象,也就是前面定义的任务类,是用name为targetObject的property来指定;然后再指定具体执行该类中的哪个方法,是用name为targetMethod的property来指定。还可以为调度任务配置一些其他参数,比如是否允许并发,这些配置是可选的。

3.配置触发器
在quartz中,常用的触发器有两种,分别是simpleTrigger和cronTrigger。simpleTrigger称为频率触发器,是用来指定间隔多久来触发一次调度任务cronTrigger是定时触发器,用来指定某个时间点来触发一次调度任务,具体选择哪个触发器根据实际的需求来定。

simpleTrigger的配置包括,指定调度任务,具体是通过name为jobDetail的property来指定;配置触发器被触发后延迟多久开始执行调度任务,是通过name为startDelay来指定的;配置间隔多久触动触发器,通过name为repeatInterval来指定的;指定重复执行多少次调度任务(即最多能够被触发多少次执行调度任务,到达这个数之后就不再被触发),通过name为repeatCount的property来指定。其中后面几种配置是可选的,配置调度任务时必须得。

cronTrigger的配置包括,指定调度任务,通过name为jobDetail的property来指定;配置定时表达式,即配置什么时间点触发调度任务,通过name为cronExpression的property来指定。cronTrigger时间配置的解析请参考博客。

4.配置调度工厂
quartz调度工厂只能有一个。可以在name为triggers中的标签中添加多个调度任务。这样一启动web应用时就会启动调度工厂,并开始执行工厂中配置的调度任务。

以前面的MyJob类作为调度类为例,配置quartz的文件名为application.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:p="http://www.springframework.org/schema/p"      xsi:schemaLocation="http://www.springframework.org/schema/beans       http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">    <!-- 定义任务类 -->    <bean id="myJob" class="controller.MyJob"></bean>    <!-- 定义调度任务,涉及到的方法 -->    <bean id="myMethod" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">        <property name="targetObject" ref="myJob"/>        <property name="targetMethod" value="myJob"/>        <property name="concurrent" value="false"/>    <!-- 配置false,不允许并发执行 -->    </bean>    <!-- 定义触发器,这里为定时触发器,还存在一种频率触发器 -->    <bean id="myCron" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">        <property name="jobDetail" ref="myMethod" />        <!-- 触发器需要出发的任务 -->        <property name="cronExpression" >                  <!-- 触发器的时间触发条件 -->            <value>0 0 0 * * ?</value>     <!-- 秒 分 时 日 月 星期几 年,每天00:00:00触发 -->        </property>    </bean>    <!--定义频率触发器-->    <bean id="mySimple" class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean">        <property name="jobDetail" ref="myMethod"/>        <property name="startDelay">                      <!-- 触发器被触发后,延迟多久执行任务 -->            <value>0</value>                              <!-- value中单位为ms -->        </property>        <property name="repeatInterval">                  <!-- 指明间隔多久触发一次,这里为10秒 -->            <value>10000</value>                          <!-- value中单位为ms -->        </property>        <!--          <property name="repeatCount">                     用于指明重复执行的次数            <value>10</value>        </property>        -->    </bean>    <!-- 定义quartz调度工厂,调度工厂只能有一个,多个调度任务在list中添加 -->    <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">        <property name="triggers">            <list>    <!-- 用于添加多个调度任务的list -->                <ref local="mySimple"/>            </list>        </property>    </bean> </beans>

(四)配置web.xml

配置完quartz之后,我们需要在启动web应用时加载该配置文件,这样才能实现web启动时调度工厂也被启动。首先在web.xml中配置spring上下文监听器,当遇到需要加载其他xml文件,这个监听器就会调用监听器中的类来加载文件,具体通过配置来实现的;然后再配置需要加载的xml的路径,具体是通过配置来实现的。web.xml文件代码如下所示:

<?xml version="1.0" encoding="UTF-8"?><web-app id="starter" version="2.4"         xmlns="http://java.sun.com/xml/ns/j2ee"         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"         xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">        <!-- 加载quartz配置文件-->        <context-param>            <param-name>contextConfigLocation</param-name>            <param-value>/WEB-INF/classes/application.xml</param-value>        </context-param>        <!--添加上下文监听器-->        <listener>            <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>        </listener>        <welcome-file-list>            <welcome-file>index.jsp</welcome-file>        </welcome-file-list></web-app>

程序运行结果如下所示:
这里写图片描述

0 0
原创粉丝点击