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>
效果如下所示:
待續……