Spring集成Quartz框架的兩種方式。


可參考: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種方式開始=========================\n\n\n");
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) + "\n\n\n");
20         System.out.println("==============================第1種方式開始=========================\n\n\n");
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種方式開始=========================\n\n\n");
21         Date date = new Date();
22         SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
23         System.out.println("第2種方式:我的調度作業 執行了呢!" + sf.format(date) + "\n\n\n");
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被調用了......\n\n\n");
10         System.out.println("==============================第2種方式:結束=========================\n\n\n");
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>  

效果如下所示:

 

待續......


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM