上一节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 项目的整合(方法二)
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://blog.csdn.net/china_shrimp/article/details/52143585
内容来源于网络,如有侵权,请联系作者删除!