Spring集成Quartz框架的两种方式。

  • 2019 年 10 月 8 日
  • 笔记

可参考:https://blog.csdn.net/yk614294861/article/details/84324603

1、使用Spring与Quarta配置作业得两种方式:   a、方式一,MethodInvokingJobDetailFactoryBean。作业类即普通的java类,不需要继承自任何基类。   b、方式二,JobDetailFactoryBean。作业类需要继承自特定的作业类基类,如Quartz中需要继承自org.springframework.scheduling.quartz.QuartzJobBean。

2、创建一个maven项目,web工程的。引入pom.xml包。

 1 <project xmlns="http://maven.apache.org/POM/4.0.0"   2     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   3     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">   4     <modelVersion>4.0.0</modelVersion>   5     <groupId>com.bie</groupId>   6     <artifactId>springQuartz</artifactId>   7     <packaging>war</packaging>   8     <version>0.0.1-SNAPSHOT</version>   9     <name>springQuartz Maven Webapp</name>  10     <url>http://maven.apache.org</url>  11  12     <properties>  13         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>  14         <spring.version>4.3.6.RELEASE</spring.version>  15     </properties>  16     <dependencies>  17         <dependency>  18             <groupId>junit</groupId>  19             <artifactId>junit</artifactId>  20             <version>3.8.1</version>  21             <scope>test</scope>  22         </dependency>  23         <dependency>  24             <groupId>org.springframework</groupId>  25             <artifactId>spring-webmvc</artifactId>  26             <version>${spring.version}</version>  27         </dependency>  28         <dependency>  29             <groupId>org.springframework</groupId>  30             <artifactId>spring-context</artifactId>  31             <version>${spring.version}</version>  32         </dependency>  33  34         <dependency>  35             <groupId>org.springframework</groupId>  36             <artifactId>spring-aop</artifactId>  37             <version>${spring.version}</version>  38         </dependency>  39  40         <dependency>  41             <groupId>org.springframework</groupId>  42             <artifactId>spring-core</artifactId>  43             <version>${spring.version}</version>  44         </dependency>  45  46         <dependency>  47             <groupId>org.springframework</groupId>  48             <artifactId>spring-context-support</artifactId>  49             <version>${spring.version}</version>  50         </dependency>  51  52         <dependency>  53             <groupId>org.springframework</groupId>  54             <artifactId>spring-tx</artifactId>  55             <version>${spring.version}</version>  56         </dependency>  57         <dependency>  58             <groupId>org.quartz-scheduler</groupId>  59             <artifactId>quartz</artifactId>  60             <version>2.2.3</version>  61         </dependency>  62     </dependencies>  63     <build>  64         <finalName>springquartz</finalName>  65         <plugins>  66             <plugin>  67                 <groupId>org.apache.maven.plugins</groupId>  68                 <artifactId>maven-compiler-plugin</artifactId>  69                 <configuration>  70                     <source>1.8</source>  71                     <target>1.8</target>  72                 </configuration>  73             </plugin>  74         </plugins>  75     </build>  76  77 </project>

然后配置一下你的web.xml配置文件。

 1 <?xml version="1.0" encoding="UTF-8"?>   2 <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   3     xmlns="http://xmlns.jcp.org/xml/ns/javaee"   4     xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee   5     http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"   6     id="WebApp_ID" version="3.1">   7     <display-name>springQuartz</display-name>   8     <welcome-file-list>   9         <welcome-file>index.html</welcome-file>  10         <welcome-file>index.jsp</welcome-file>  11     </welcome-file-list>  12  13     <!-- spring MVC的核心就是DispatcherServlet,使用springMVC的第一步就是将下面的servlet放入web.xml  14         servlet-name属性非常重要,默认情况下,DispatchServlet会加载这个名字-servlet.xml的文件, 如下,就会加载 dispather-servlet.xml,也是在WEN-INF目录下。 -->  15     <servlet>  16         <!-- 配置DispatcherServlet -->  17         <servlet-name>springMvc</servlet-name>  18         <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>  19         <!-- 指定spring mvc配置文件位置 不指定使用默认情况 -->  20         <init-param>  21             <param-name>contextConfigLocation</param-name>  22             <param-value>classpath:/spring-mvc.xml</param-value>  23         </init-param>  24         <!-- 设置启动顺序 -->  25         <load-on-startup>1</load-on-startup>  26     </servlet>  27     <!-- ServLet 匹配映射 -->  28     <!-- 设置dispatchservlet的匹配模式,通过把dispatchservlet映射到/,默认servlet会处理所有的请求,包括静态资源 -->  29     <servlet-mapping>  30         <servlet-name>springMvc</servlet-name>  31         <url-pattern>/</url-pattern>  32     </servlet-mapping>  33  34  35  36  37 </web-app>

3、使用第一种方式。方式一,MethodInvokingJobDetailFactoryBean。作业类即普通的java类,不需要继承自任何基类。

 1 package com.bie.quartz;   2   3 import java.text.SimpleDateFormat;   4 import java.util.Date;   5   6 import org.springframework.stereotype.Component;   7   8 @Component("myBean")   9 public class MyBean {  10  11     /**  12      *  13      */  14     public void printMessage() {  15         System.out.println("==============================第1种方式开始=========================nnn");  16         // 打印当前的执行时间,格式为2017-01-01 00:00:00  17         Date date = new Date();  18         SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  19         System.out.println("第1种方式:我的bean 执行了呢!" + sf.format(date) + "nnn");  20         System.out.println("==============================第1种方式开始=========================nnn");  21  22     }  23 }

4、使用第二种方式,方式二,JobDetailFactoryBean。作业类需要继承自特定的作业类基类,

如Quartz中需要继承自org.springframework.scheduling.quartz.QuartzJobBean;

 1 package com.bie.quartz;   2   3 import java.text.SimpleDateFormat;   4 import java.util.Date;   5   6 import org.quartz.JobExecutionContext;   7 import org.quartz.JobExecutionException;   8 import org.springframework.scheduling.quartz.QuartzJobBean;   9  10 public class FirstScheduledJob extends QuartzJobBean {  11  12     private AnotherBean anotherBean;  13  14     public void setAnotherBean(AnotherBean anotherBean) {  15         this.anotherBean = anotherBean;  16     }  17  18     @Override  19     protected void executeInternal(JobExecutionContext arg0) throws JobExecutionException {  20         System.out.println("==============================第2种方式开始=========================nnn");  21         Date date = new Date();  22         SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  23         System.out.println("第2种方式:我的调度作业 执行了呢!" + sf.format(date) + "nnn");  24         this.anotherBean.printAnotherMessage();  25     }  26 }
 1 package com.bie.quartz;   2   3 import org.springframework.stereotype.Component;   4   5 @Component("anotherBean")   6 public class AnotherBean {   7   8     public void printAnotherMessage() {   9         System.out.println("第2种方式: 自己注入的bean被调用了......nnn");  10         System.out.println("==============================第2种方式:结束=========================nnn");  11     }  12  13 }

然后配置一下你的配置文件。就可以启动了。需要注意的是如果全局default-lazy-init="true",懒加载,需要调用才会进行调度的。如果将lazy-init='false',不懒加载,那么容器启动就会执行调度程序。

  1 <?xml version="1.0" encoding="UTF-8"?>    2 <beans xmlns="http://www.springframework.org/schema/beans"    3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    4     xmlns:context="http://www.springframework.org/schema/context"    5     xmlns:mvc="http://www.springframework.org/schema/mvc"    6     xmlns:p="http://www.springframework.org/schema/p"    7     xsi:schemaLocation="http://www.springframework.org/schema/beans    8             http://www.springframework.org/schema/beans/spring-beans.xsd    9             http://www.springframework.org/schema/mvc   10             http://www.springframework.org/schema/mvc/spring-mvc.xsd   11             http://www.springframework.org/schema/context   12             http://www.springframework.org/schema/context/spring-context.xsd">   13   14     <!-- 通过mvc:resources设置静态资源,这样servlet就会处理这些静态资源,而不通过控制器 -->   15     <!-- 设置不过滤内容,比如:css,jquery,img 等资源文件 -->   16     <mvc:resources location="/*.html" mapping="/**.html" />   17     <mvc:resources location="/css/*" mapping="/css/**" />   18     <mvc:resources location="/js/*" mapping="/js/**" />   19     <mvc:resources location="/images/*" mapping="/images/**" />   20     <!-- 设定消息转换的编码为utf-8防止controller返回中文乱码 -->   21     <bean   22         class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">   23         <property name="messageConverters">   24             <list>   25                 <bean   26                     class="org.springframework.http.converter.StringHttpMessageConverter">   27                     <property name="supportedMediaTypes">   28                         <list>   29                             <value>text/html;charset=UTF-8</value>   30                         </list>   31                     </property>   32                 </bean>   33             </list>   34         </property>   35     </bean>   36     <!-- 添加注解驱动 -->   37     <mvc:annotation-driven />   38     <!-- 默认扫描的包路径 -->   39     <context:component-scan base-package="com.bie" />   40   41     <!-- mvc:view-controller可以在不需要Controller处理request的情况,转向到设置的View -->   42     <!-- 像下面这样设置,如果请求为/,则不通过controller,而直接解析为/index.jsp -->   43     <mvc:view-controller path="/" view-name="index" />   44     <bean   45         class="org.springframework.web.servlet.view.UrlBasedViewResolver">   46         <property name="viewClass"   47             value="org.springframework.web.servlet.view.JstlView"></property>   48         <!-- 配置jsp路径前缀 -->   49         <property name="prefix" value="/"></property>   50         <!-- 配置URl后缀 -->   51         <property name="suffix" value=".jsp"></property>   52     </bean>   53   54     <!-- ====================================================================================================== -->   55   56     <!-- 第一种方式 -->   57     <!--第一步 要执行任务的作业类。 -->   58     <!-- 由于这里采用了注解方式,所以下面得ref直接使用自己注入容器得bean即可。 -->   59   60     <!-- 第二步 将需要执行的定时任务注入JOB中。JobDetail是将定时任务进行组合。 -->   61     <bean id="simpleJobDetail"   62         class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">   63         <!-- 任务类中需要执行的目标类 -->   64         <property name="targetObject" ref="myBean" />   65         <!-- 任务类中需要执行的方法 -->   66         <property name="targetMethod" value="printMessage" />   67         <!-- 上一次未执行完成的,要等待有再执行。 -->   68         <property name="concurrent" value="false"></property>   69     </bean>   70   71     <!-- 距离当前时间1秒之后执行,之后每隔两秒钟执行一次 -->   72     <bean id="mySimpleTrigger"   73         class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean">   74         <!-- 引用上面得ref="simpleJobDetail" -->   75         <property name="jobDetail" ref="simpleJobDetail" />   76         <!-- 距离当前时间1秒之后执行 -->   77         <property name="startDelay" value="1000" />   78         <!-- 之后每隔两秒钟执行一次 -->   79         <property name="repeatInterval" value="2000" />   80     </bean>   81   82     <!-- 第四步 配置调度工厂 -->   83     <bean   84         class="org.springframework.scheduling.quartz.SchedulerFactoryBean">   85         <property name="triggers">   86             <list>   87                 <!-- 简单定时任务触发器 -->   88                 <ref bean="mySimpleTrigger" />   89             </list>   90         </property>   91         <property name="jobDetails">   92             <list>   93                 <!-- 引用作业详情 -->   94                 <ref bean="simpleJobDetail" />   95             </list>   96         </property>   97     </bean>   98   99  100     <!-- ====================================================================================================== -->  101  102  103     <!-- 第二种方式 -->  104     <!--第一步:1.将自定义的job类(已经继承QuartzJobBean) 注入JobDetailFactoryBean -->  105     <bean id="firstComplexJobDetail"  106         class="org.springframework.scheduling.quartz.JobDetailFactoryBean">  107         <property name="jobClass"  108             value="com.bie.quartz.FirstScheduledJob" />  109         <property name="jobDataMap">  110             <map>  111                 <!-- 注入其他bean引用 -->  112                 <entry key="anotherBean" value-ref="anotherBean" />  113             </map>  114         </property>  115         <property name="durability" value="true" />  116     </bean>  117  118  119     <!-- 每隔5秒钟执行一次 -->  120     <!--第二步:2. 定义触发器,并且将jobDetail注入 -->  121     <bean id="myCronTrigger"  122         class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">  123         <property name="jobDetail" ref="firstComplexJobDetail" />  124         <!-- 每隔5秒钟执行一次 -->  125         <property name="cronExpression" value="0/5 * * ? * *" />  126     </bean>  127  128     <!-- 总管理类 如果将lazy-init='false'那么容器启动就会执行调度程序 -->  129     <!-- 全局default-lazy-init="true"需要调用才会进行调度的。 -->  130     <!-- 第三步:配置调度工厂 -->  131     <bean lazy-init="false"  132         class="org.springframework.scheduling.quartz.SchedulerFactoryBean">  133         <property name="triggers">  134             <list>  135                 <ref bean="myCronTrigger" />  136             </list>  137         </property>  138         <property name="jobDetails">  139             <list>  140                 <ref bean="firstComplexJobDetail" />  141             </list>  142         </property>  143     </bean>  144  145  146 </beans>  

效果如下所示:

待续……