Quartz(07) quartz spring web 项目的整合(方法一)

x33g5p2x  于2021-12-21 转载在 其他  
字(5.9k)|赞(0)|评价(0)|浏览(237)

上一节Quartz(06) quartz整合到web项目中
Spring是一个百宝箱,集成和很多优秀的框架,当然quartz 也被集成到了Spring框架中.Spring 整合Quartz 方法有两种,本文采取第一种方式,更加常用的一种方式在下一章讨论.

源码下载地址

1.首先把Spring的监听加到web.xml,由于Quartz交给Spring来管理,自然所有的初始化工作是由spring来完成,配置监听是必要的,而且 QuartzInitializerServlet 这个初始化Quartz的Servlet也不需要了.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" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaeehttp://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
  <!-- 单纯的Quartz 和web项目整合,没有和Spring 框架整合. -->
  <!-- 增加配置的Quartz 初始化的QuartzInitializerServlet 到web.xml -->
  <!-- <servlet> <servlet-name>QuartzInitializer</servlet-name> <servlet-class>org.quartz.ee.servlet.QuartzInitializerServlet</servlet-class> <init-param> <param-name>config-file</param-name> <param-value>quartz.properties</param-value> </init-param> <init-param> <param-name>shutdown-on-unload</param-name> <param-value>true</param-value> </init-param> <init-param> <param-name>start-scheduler-on-load</param-name> <param-value>true</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> -->
  <!-- Spring quartz web项目整合,上面的QuartzInitializerServlet不再需要 -->
  <listener>
      <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener> 
</web-app>

2.配置spring文件 在applicationContext.xml 配置文件中我们使用MethodInvokingJobDetailFactoryBean 来注册jobDetail.注意这种方式注册的jobDetail,我们自定义的job类是一个普通的方法,而且targetMethod(一般是execute方法)不能有参数也不能有返回值,而且采用这种方式配置的任务不能持久化到数据库.

applicationContext.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:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd">
     <!-- 配置Quartz的两种方式 -->
     <!-- 1.使用 MethodInvokingJobDetailFactoryBean 来注册jobDetail -->
     <!-- 2.使用JobDetailFactoryBean 来注册jobDetail -->
     <!-- 二者之间的区别.使用方法1,自定义的job类是普通的类不需实现job接口,而且targetMethod必须是无参的方法.使用方便,但是job无法持久化(JobStoreTX) -->
     <!-- 二者之间的区别.使用方法2,自定义的job类需实现job接口 使用复杂些但是job可以持久化(JobStoreTX)-->
     <!-- 本例采用第1种方式,quartz07中采用第二种方式配置 ,quartz08 采用方法2,并且实现job持久化-->
     <!-- Q1/Q2没有实现job接口,二者execute方法是无参数方法 -->
    <bean id="Q1" class="com.quartz.job.Q1"/>
    <bean id="Q2" class="com.quartz.job.Q2"/>

    <bean id="myJobDetail1" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
        <property name="targetObject">
            <ref bean="Q1"/>
        </property>
        <!-- Job实例中的方法 -->  
        <property name="targetMethod">  
             <value>execute</value>  
        </property> 
    </bean>
    <bean id="myTrigger1" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
        <property name="name" value="my_job1"/>
        <property name="group" value="my_group1"/>
        <property name="jobDetail">
            <ref bean="myJobDetail1"/>
        </property>
        <property name="cronExpression">
            <value>0/5 * * * * ?</value>
        </property>
    </bean>
    <bean id="myJobDetail2" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
        <property name="targetObject">
            <ref bean="Q2"/>
        </property>
        <!-- Job实例中的方法 -->  
        <property name="targetMethod">  
             <value>execute</value>  
        </property> 
    </bean>
    <bean id="myTrigger2" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
        <property name="name" value="my_job1"/>
        <property name="group" value="my_group2"/>
        <property name="jobDetail">
            <ref bean="myJobDetail2"/>
        </property>
        <property name="cronExpression">
            <value>0/5 * * * * ?</value>
        </property>
    </bean>
    <bean id="scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
        <property name="triggers">
            <list>
                <ref bean="myTrigger1"/>
                <ref bean="myTrigger2"/>
            </list>
        </property>
    </bean>
</beans>

3.两个自定义Job类,Q1/Q2都是普通的方法,并没有实现com.quartz.job接口,如果实现com.quartz.job接口,那么execute方法就变成public void execute(JobExecutionContext context) throws JobExecutionException,这样是会报错的.

com.quartz.job.Q1

package com.quartz.job;

import java.text.SimpleDateFormat;
import java.util.Date;

public class Q1 {
    // Q1就不能实现Job接口,否则就会报错.或者说execut方法如果有参数
    public void execute() {
        System.out.println("------------------------");
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd hh:mm:ss");
        System.out.println(sdf.format(new Date()));
        System.out.println("------------------------");
    }

}

com.quartz.job.Q2

package com.quartz.job;

import java.text.SimpleDateFormat;
import java.util.Date;

public class Q2 {
    // Q2就不能实现Job接口,否则就会报错.或者说execut方法如果有参数
    public void execute() {
        System.out.println("************************");
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd hh:mm:ss");
        System.out.println(sdf.format(new Date()));
        System.out.println("************************");
    }

}

文件目录

这样启动web项目的时候,Quartz也启动了.
下一节Quartz(08) quartz spring web 项目的整合(方法二)

相关文章