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

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

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

源码下载地址

1.首先把Spring的监听加到web.xml,由于Quartz交给Spring来管理,自然所有的初始化工作是由spring来完成,配置监听是必要的,而且 QuartzInitializerServlet 这个初始化Quartz的Servlet也不需要了.web.xml文件配置如下:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <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">
  3. <welcome-file-list>
  4. <welcome-file>index.jsp</welcome-file>
  5. </welcome-file-list>
  6. <!-- 单纯的Quartz 和web项目整合,没有和Spring 框架整合. -->
  7. <!-- 增加配置的Quartz 初始化的QuartzInitializerServlet 到web.xml -->
  8. <!-- <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> -->
  9. <!-- Spring quartz web项目整合,上面的QuartzInitializerServlet不再需要 -->
  10. <listener>
  11. <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  12. </listener>
  13. </web-app>

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

applicationContext.xml 的配置如下:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <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">
  3. <!-- 配置Quartz的两种方式 -->
  4. <!-- 1.使用 MethodInvokingJobDetailFactoryBean 来注册jobDetail -->
  5. <!-- 2.使用JobDetailFactoryBean 来注册jobDetail -->
  6. <!-- 二者之间的区别.使用方法1,自定义的job类是普通的类不需实现job接口,而且targetMethod必须是无参的方法.使用方便,但是job无法持久化(JobStoreTX) -->
  7. <!-- 二者之间的区别.使用方法2,自定义的job类需实现job接口 使用复杂些但是job可以持久化(JobStoreTX)-->
  8. <!-- 本例采用第1种方式,quartz07中采用第二种方式配置 ,quartz08 采用方法2,并且实现job持久化-->
  9. <!-- Q1/Q2没有实现job接口,二者execute方法是无参数方法 -->
  10. <bean id="Q1" class="com.quartz.job.Q1"/>
  11. <bean id="Q2" class="com.quartz.job.Q2"/>
  12. <bean id="myJobDetail1" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
  13. <property name="targetObject">
  14. <ref bean="Q1"/>
  15. </property>
  16. <!-- Job实例中的方法 -->
  17. <property name="targetMethod">
  18. <value>execute</value>
  19. </property>
  20. </bean>
  21. <bean id="myTrigger1" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
  22. <property name="name" value="my_job1"/>
  23. <property name="group" value="my_group1"/>
  24. <property name="jobDetail">
  25. <ref bean="myJobDetail1"/>
  26. </property>
  27. <property name="cronExpression">
  28. <value>0/5 * * * * ?</value>
  29. </property>
  30. </bean>
  31. <bean id="myJobDetail2" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
  32. <property name="targetObject">
  33. <ref bean="Q2"/>
  34. </property>
  35. <!-- Job实例中的方法 -->
  36. <property name="targetMethod">
  37. <value>execute</value>
  38. </property>
  39. </bean>
  40. <bean id="myTrigger2" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
  41. <property name="name" value="my_job1"/>
  42. <property name="group" value="my_group2"/>
  43. <property name="jobDetail">
  44. <ref bean="myJobDetail2"/>
  45. </property>
  46. <property name="cronExpression">
  47. <value>0/5 * * * * ?</value>
  48. </property>
  49. </bean>
  50. <bean id="scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
  51. <property name="triggers">
  52. <list>
  53. <ref bean="myTrigger1"/>
  54. <ref bean="myTrigger2"/>
  55. </list>
  56. </property>
  57. </bean>
  58. </beans>

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

com.quartz.job.Q1

  1. package com.quartz.job;
  2. import java.text.SimpleDateFormat;
  3. import java.util.Date;
  4. public class Q1 {
  5. // Q1就不能实现Job接口,否则就会报错.或者说execut方法如果有参数
  6. public void execute() {
  7. System.out.println("------------------------");
  8. SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd hh:mm:ss");
  9. System.out.println(sdf.format(new Date()));
  10. System.out.println("------------------------");
  11. }
  12. }

com.quartz.job.Q2

  1. package com.quartz.job;
  2. import java.text.SimpleDateFormat;
  3. import java.util.Date;
  4. public class Q2 {
  5. // Q2就不能实现Job接口,否则就会报错.或者说execut方法如果有参数
  6. public void execute() {
  7. System.out.println("************************");
  8. SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd hh:mm:ss");
  9. System.out.println(sdf.format(new Date()));
  10. System.out.println("************************");
  11. }
  12. }

文件目录

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

相关文章