使用SpringMvc自带的Quartz完成定时任务

在管理系统中经常有固定的时间点或每隔一段时间就需要执行的任务,JAVA自带的Timer类中的Task可以完成此功能,但由于配置信息都是写在代码中的,若想更改只能重新封装war包,所以大部分的项目会使用quartZ进行定时任务(SpringMVC算是当前java中应用比较广泛的框架了,本身集成了quartz,使用起来很方便).Timer有个最主要的问题,无法实现指定时间执行,只能是循环某个时间段,而quartz完全没有这种问题.

使用quartz首先需要导入jar包,commons-discovery-0.2.jar,commons-logging.jar,jaxrpc.jar,log4j-1.2.16.jar,quartz-2.2.1.jar,quartz-jobs-2.2.1.jar,saaj.jar,这些是我使用的jar包,spring版本是4.2,quartz版本是2.2(quzrtz版本一定要和spring版本适配,否则会出现大量的classNotFound的bug).

准备工作完成后就开始quartz的配置了,首先是建立quartz配置文件,使用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:jee="http://www.springframework.org/schema/jee"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.0.xsd">


        <!-- 要调用的工作类 -->
        <bean id="quartzDay" class="com.autoDeduct.AutoDeductDayMail"></bean>

        <!-- 定义调用对象和调用对象的方法 -->
 		<bean id="daymailtask" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
            <!-- 调用的类 -->
            <property name="targetObject">
                <ref bean="quartzDay"/>
            </property>
            <!-- 调用类中的方法 -->
            <property name="targetMethod">
                <value>sendMail</value>
            </property>
        </bean>
        
         <bean id="doDayMailTime" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
            <property name="jobDetail">
                <ref bean="daymailtask"/>
            </property>
            <!-- cron表达式 -->
            <property name="cronExpression">
                <!-- 每隔10秒执行一次-->
                <value>0 59 16 * * ?</value>
            </property>
        </bean>        
         
        <!-- 总管理类 如果将lazy-init='false'那么容器启动就会执行调度程序 -->
        <bean id="startQuertz" lazy-init="false" autowire="no" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
            <property name="triggers">
                <list>
                       <ref bean="doDayMailTime"/>
                </list>
            </property>
        </bean>
   
</beans>
具体的执行频率和指定时间在doDayMailTime中配置,quartz有专用的cron表达式,具体的表达式可以去网上搜索,根据自己的需求填写cron表达式,我的功能是每天16.59的时候会调用daytimetask中配置的quartzDay类中的sendMail的方法,而quartzDay在开始映射了com. autoDeduct.AutoDeductDayMail,那程序在16.59的时候就会去该类下找到sendMail方法去执行.定时任务就完成了效果.

注意:如果配置完成后,项目启动出现classnotfound,别急,仔细看看究竟是哪个类不见了,出现这种问题的主要问题一般是jar包对应不好,先去看看自己的项目下的jar包中是否有包含这个类,低版本的quartz是直接调用bean的,而高版本的quartz是调用factoryBean来创造bean的,如果使用了低版本的quartz需要把bean对应的class设置成对应的bean.

猜你喜欢

转载自blog.csdn.net/w741998232/article/details/53635088