Quartz-Spring集成Quartz通过XML配置的方式
文章目錄
- 概述
- Maven依賴
- 步驟
- 1 創(chuàng)建JobDteail
- 2 創(chuàng)建Trigger
- 3 創(chuàng)建Scheduler
- 示例-MethodInvokingJobDetailFactoryBean
- 示例-JobDetailFactoryBean
- 示例源碼
概述
Spring為創(chuàng)建Quartzde Scheduler、Trigger和JobDetail提供了方便的FactoryBean類,以便能夠在Spring容器中享受注入的好處。
此外,Spring還通了一些便利的工具類,用于直接將Spring中的Bean包裝成合法的任務(wù)。
Spring進一步降低了使用Quartz的難度,能夠以更加Spring風(fēng)格的方式使用Quartz,主要體現(xiàn)在如下兩點
-
為Quartz的重要組件提供更具Bean風(fēng)格的擴展類
-
提供創(chuàng)建Scheduler的BeanFactory類,方便在Spring環(huán)境下創(chuàng)建對應(yīng)的組件對象,并結(jié)合Spring容器生命周期執(zhí)行啟動和停止的動作
Maven依賴
主要的兩個依賴如下:
<dependency><groupId>org.springframework</groupId><artifactId>spring-context-support</artifactId><version>${spring.version}</version> </dependency><dependency><groupId>org.quartz-scheduler</groupId><artifactId>quartz</artifactId><version>2.2.3</version> </dependency>spring-context-support包主要是Spring集成了很多有用的第三方庫,我們在使用第三方的東西的時候一般都需要引入該依賴。
步驟
Spring通過xml的方式集成Quartz,主要有兩種方式
JobDteail通過JobDetailBean實現(xiàn)
JobDteail通過MethodInvokeJobDetailFactoryBean實現(xiàn)(推薦)
1 創(chuàng)建JobDteail
Spring通過擴展JobDetail提供了一個更具Bean風(fēng)格的JobDetailFactoryBean,此外Spring還提供了了一個 MethodInvokingJobDetailFactoryBean,通過這個FactoryBean可以將Spring容器中的Bean的方法包裝成Quartz任務(wù),這樣我們就不必為Job創(chuàng)建對應(yīng)的類。
案例中會分別講述兩種實現(xiàn)方式的區(qū)別
2 創(chuàng)建Trigger
Quartz中另外一個重要的組件就是Trigger,Spring按照相似的思路分別為SimpleTrigger和CronTrigger提供了更具Bean風(fēng)格的CronTriggerFactoryBean和SimpleTriggerFactoryBean擴展類。
3 創(chuàng)建Scheduler
Quartz的SchedulerFactory是標(biāo)準(zhǔn)的工廠類,不太適合在Spring中使用。 此外為了保證Scheduler能夠感知Spring容器的生命周期,在Spring容器啟動后,Scheduler自動開始工作,而在Spring容器關(guān)閉前,自動關(guān)閉Scheduler。為此Spring提供了SchedulerFactoryBean.
示例-MethodInvokingJobDetailFactoryBean
因為下面的案例中我們使用MethodInvokingJobDetailFactoryBean,所以下面的這個Job無需繼承任何類或者實現(xiàn)任何接口
模擬業(yè)務(wù)類
配置成一個普通的java類即可
package com.xgj.quartz.quartzWithSpring.xml;/*** * * @ClassName: MyJob* * @Description: 不用繼承Quartz的Job接口* * @author: Mr.Yang* * @date: 2017年11月10日 下午10:17:26*/ public class MyJob {public void execute() {System.out.println("Quartz Spring XML 配置 - MyJob");}}Spring集成Quartz的配置文件
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"><!-- 配置Job類 --><bean id="myJob" class="com.xgj.quartz.quartzWithSpring.xml.MyJob"></bean><!-- 配置JobDetail --><bean id="springQtzJobMethod" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"><!-- 執(zhí)行目標(biāo)job --><property name="targetObject" ref="myJob"></property><!-- 要執(zhí)行的方法 --><property name="targetMethod" value="execute"></property></bean><!-- 配置tirgger觸發(fā)器 --><bean id="cronTriggerFactoryBean" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean"><!-- jobDetail --><property name="jobDetail" ref="springQtzJobMethod"></property><!-- cron表達(dá)式,執(zhí)行時間 每5秒執(zhí)行一次 --><property name="cronExpression" value="0/5 * * * * ?"></property></bean><!-- 配置調(diào)度工廠 --><bean id="springJobSchedulerFactoryBean" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"><property name="triggers"><list><ref bean="cronTriggerFactoryBean"></ref></list></property></bean> </beans>除了使用CronTrigger也可以使用SimpleTrigger配置,示例代碼如下
<bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean"><!--配置具體要執(zhí)行的jobDetail--><property name="jobDetail" ref="simpleJobDetail" /><!--初始延遲時間 1s--><property name="startDelay" value="1000" /><!--間隔執(zhí)行時間每2s執(zhí)行一次--><property name="repeatInterval" value="2000" /> </bean>測試類
package com.xgj.quartz.quartzWithSpring.xml;import org.springframework.context.support.ClassPathXmlApplicationContext;public class SpringQuartzXmlTest {public static void main(String[] args) {// 啟動Spring 容器ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("classpath:com/xgj/quartz/quartzWithSpring/xml/application.xml");System.out.println("initContext successfully");} }在調(diào)度器中,有一個lazy-init參數(shù),如果lazy-init=‘false’,則容器啟動時就會執(zhí)行調(diào)度程序;如果lazy-init=‘true’,則需要實例化該bean才能執(zhí)行調(diào)度程序;
<bean id="springJobSchedulerFactoryBean" class="org.springframework.scheduling.quartz.SchedulerFactoryBean" lazy-init="true">運行結(jié)果
2017-11-11 02:03:41,399 INFO [main] (AbstractApplicationContext.java:583) - Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@174580e6: startup date [Sat Nov 11 02:03:41 BOT 2017]; root of context hierarchy 2017-11-11 02:03:41,481 INFO [main] (XmlBeanDefinitionReader.java:317) - Loading XML bean definitions from class path resource [com/xgj/quartz/quartzWithSpring/xml/application.xml] INFO StdSchedulerFactory - Using default implementation for ThreadExecutor INFO SchedulerSignalerImpl - Initialized Scheduler Signaller of type: class org.quartz.core.SchedulerSignalerImpl INFO QuartzScheduler - Quartz Scheduler v.2.2.3 created. INFO RAMJobStore - RAMJobStore initialized. INFO QuartzScheduler - Scheduler meta-data: Quartz Scheduler (v2.2.3) 'springJobSchedulerFactoryBean' with instanceId 'NON_CLUSTERED'Scheduler class: 'org.quartz.core.QuartzScheduler' - running locally.NOT STARTED.Currently in standby mode.Number of jobs executed: 0Using thread pool 'org.quartz.simpl.SimpleThreadPool' - with 10 threads.Using job-store 'org.quartz.simpl.RAMJobStore' - which does not support persistence. and is not clustered.INFO StdSchedulerFactory - Quartz scheduler 'springJobSchedulerFactoryBean' initialized from an externally provided properties instance. INFO StdSchedulerFactory - Quartz scheduler version: 2.2.3 INFO QuartzScheduler - JobFactory set to: org.springframework.scheduling.quartz.AdaptableJobFactory@7fe0dbb6 2017-11-11 02:03:42,862 INFO [main] (DefaultLifecycleProcessor.java:343) - Starting beans in phase 2147483647 2017-11-11 02:03:42,862 INFO [main] (SchedulerFactoryBean.java:645) - Starting Quartz Scheduler now INFO QuartzScheduler - Scheduler springJobSchedulerFactoryBean_$_NON_CLUSTERED started. initContext successfully Quartz Spring XML 配置 - MyJob Quartz Spring XML 配置 - MyJob Quartz Spring XML 配置 - MyJob Quartz Spring XML 配置 - MyJob Quartz Spring XML 配置 - MyJob ....... ....... ....... .......示例-JobDetailFactoryBean
業(yè)務(wù)Job模擬類
package com.xgj.quartz.quartzWithSpring.xml2;import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; import org.springframework.scheduling.quartz.QuartzJobBean;/*** * * @ClassName: MyJob2* * @Description: 配置文件中使用JobDetailBean,這是業(yè)務(wù)Job需要繼承QuartzJobBean* * @author: Mr.Yang* * @date: 2017年11月12日 上午7:54:28*/ public class MyJob2 extends QuartzJobBean {@Overrideprotected void executeInternal(JobExecutionContext ctx)throws JobExecutionException {System.out.println("Spring 集成 Quartz 的第二種方式");}}Spring集成Quartz的配置文件
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"><!-- 配置Job類 --><bean id="myJob" class="com.xgj.quartz.quartzWithSpring.xml.MyJob"></bean><!-- 配置JobDetail --><bean id="jobDetail" class="org.springframework.scheduling.quartz.JobDetailFactoryBean"><property name="jobClass" value="com.xgj.quartz.quartzWithSpring.xml2.MyJob2"></property><property name="durability" value="true"></property></bean><!-- 配置tirgger觸發(fā)器 --><bean id="cronTriggerFactoryBean" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean"><!-- jobDetail --><property name="jobDetail" ref="jobDetail"></property><!-- cron表達(dá)式,執(zhí)行時間 每5秒執(zhí)行一次 --><property name="cronExpression" value="0/5 * * * * ?"></property></bean><!-- 配置調(diào)度工廠 如果將lazy-init='false'那么容器啟動就會執(zhí)行調(diào)度程序 --><bean id="springJobSchedulerFactoryBean" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"><property name="triggers"><list><ref bean="cronTriggerFactoryBean"></ref></list></property></bean> </beans>測試類
package com.xgj.quartz.quartzWithSpring.xml2;import org.springframework.context.support.ClassPathXmlApplicationContext;public class SpringQuartzXmlTest {public static void main(String[] args) {// 啟動Spring 容器ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("classpath:com/xgj/quartz/quartzWithSpring/xml2/spring-quartz.xml");System.out.println("initContext successfully");} }運行結(jié)果
2017-11-12 08:14:27,934 INFO [main] (AbstractApplicationContext.java:583) - Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@4af6178d: startup date [Sun Nov 12 08:14:27 BOT 2017]; root of context hierarchy 2017-11-12 08:14:28,014 INFO [main] (XmlBeanDefinitionReader.java:317) - Loading XML bean definitions from class path resource [com/xgj/quartz/quartzWithSpring/xml2/spring-quartz.xml] INFO StdSchedulerFactory - Using default implementation for ThreadExecutor INFO SchedulerSignalerImpl - Initialized Scheduler Signaller of type: class org.quartz.core.SchedulerSignalerImpl INFO QuartzScheduler - Quartz Scheduler v.2.2.3 created. INFO RAMJobStore - RAMJobStore initialized. INFO QuartzScheduler - Scheduler meta-data: Quartz Scheduler (v2.2.3) 'springJobSchedulerFactoryBean' with instanceId 'NON_CLUSTERED'Scheduler class: 'org.quartz.core.QuartzScheduler' - running locally.NOT STARTED.Currently in standby mode.Number of jobs executed: 0Using thread pool 'org.quartz.simpl.SimpleThreadPool' - with 10 threads.Using job-store 'org.quartz.simpl.RAMJobStore' - which does not support persistence. and is not clustered.INFO StdSchedulerFactory - Quartz scheduler 'springJobSchedulerFactoryBean' initialized from an externally provided properties instance. INFO StdSchedulerFactory - Quartz scheduler version: 2.2.3 INFO QuartzScheduler - JobFactory set to: org.springframework.scheduling.quartz.AdaptableJobFactory@404f4560 2017-11-12 08:14:28,800 INFO [main] (DefaultLifecycleProcessor.java:343) - Starting beans in phase 2147483647 2017-11-12 08:14:28,801 INFO [main] (SchedulerFactoryBean.java:645) - Starting Quartz Scheduler now INFO QuartzScheduler - Scheduler springJobSchedulerFactoryBean_$_NON_CLUSTERED started. initContext successfully Spring 集成 Quartz 的第二種方式 Spring 集成 Quartz 的第二種方式 Spring 集成 Quartz 的第二種方式 Spring 集成 Quartz 的第二種方式 Spring 集成 Quartz 的第二種方式 ....... ....... .......示例源碼
代碼已托管到Github—> https://github.com/yangshangwei/SpringMaster
總結(jié)
以上是生活随笔為你收集整理的Quartz-Spring集成Quartz通过XML配置的方式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Quartz-Java Web项目中使用
- 下一篇: asp.net ajax控件工具集 Au