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>  

效果如下所示:

待續……