一、前言
看Spring源碼蠻久了,現在使用Spring集成quartz,看能不能用所學的知識,給各位講清楚spring集成quartz是怎麼配置的!看網上好多文章都說,Spring配置quartz挺複雜的。
quarz,石英調度,一個第三方定時調度框架。
二、配置步驟
Spring的作用是管理Bean,這句話可以概括Spring框架80%的功能。我們使用Spring集成一個第三方框架時,無非就是把需要new的對象,配置到Spring IOC工廠而已。
1. 引入依賴
使用任何一個第三方的框架,都要引入依賴,這個沒啥說的。
<!--quartz核心包-->
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.3.2</version>
</dependency>
<!--spring與quartz集成要用到的支持包-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>5.0.7.RELEASE</version>
</dependency>
2. 創建自定義的任務類
public class MyQuartzJob {
public void executeMethod() {
System.out.println("開始執行任務..."+ new Date());
}
}
沒錯就是這麼簡單,在類中定義一個方法,這個方法就是你定時要執行的代碼。
然後,把這個類交給Spring管理,你用註解或者配置到xml中都可以。我這裏配置到xml中
<bean id="myQuartzJob" class="com.kaka.jtest.springboot.biz.scheduler.quartz.MyQuartzJob"/>
擴展:在quartz 1.x的時候自定義的任務類需要繼承一個QuartzJobBean的抽象類,然後實現這個類的抽象方法。最後把這個自定義的任務類的全類名設置到JobDetailBean類的jobClass屬性中,配置賊麻煩。最頭痛的是這個自定義的任務類引用spring中管理的其他bean時(如自己寫的userService),不能自動裝配,需要通過JobDetailBean類的jobDataMap注入!
3. 配置quartz(重點!!!)
都說這一步複雜,是因爲沒理解quartz的運行原理。我們不扯太多內部實現,順着大衆的邏輯走一下就明白了。
3.1 配置任務明細Bean
我們上面的那個自定義的任務類,要讓quartz幫忙執行的話,需要告訴quartz哪個類的哪個方法要定時執行吧?quartz中有個術語叫任務明細Bean,就是來包裝你自定義的任務類的。
<bean id="jobDetailBean" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<!-- 指定任務bean -->
<property name="targetObject" ref="myQuartzJob"/>
<!-- 指定任務bean中的方法 -->
<property name="targetMethod" value="executeMethod"/>
<!-- 是否允許任務併發執行。當值爲false時,表示必須等到前一個線程處理完畢後纔再啓一個新的線程 -->
<property name="concurrent" value="false"/>
</bean>
1.x的時候更直白,直接叫JobDetailBean,任務明細Bean嘛~
3.2 配置觸發器
quartz知道要調用哪個方法後,我們就需要繼續告訴quartz什麼時候調用了,這個就是觸發器,也可以叫做觸發策略。因爲我們是用戶,所以我們想怎麼定時就怎麼定時~
<bean id="cronTriggerBean" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<!-- a.設置調度的任務明細bean -->
<property name="jobDetail" ref="jobDetailBean" />
<!-- b.cron表達式:用空格分割的6到7位的字符串,我設置的每分鐘的0,15,30,45秒執行-->
<property name="cronExpression" value="0,15,30,45 * * * * ?"/>
</bean>
3.3 配置調度工廠
上面兩個配置好了,現在只差一個啓動的入口了。這個入口就是調度工廠,當Spring容器啓動時,就會通過這個SchedulerFactoryBean來啓動觸發器,進而執行我們自定義的定時任務。
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<!-- 可以有多個 -->
<list>
<ref bean="cronTriggerBean"/>
</list>
</property>
</bean>
可以看到,調度工廠中可以指定多個觸發器。也就是3.1和3.2可以寫多個,即我們可以自定義多個定時任務,並配置多個觸發器。
至此配置已完成!
三、運行
我是把配置bean的xml,都放到了other/quartz.xml文件中。Spring啓動代碼如下:
@Test
public void quartzTest() throws InterruptedException {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext(
"other/quartz.xml");
System.out.println(applicationContext);
TimeUnit.SECONDS.sleep(10000L);
}
結果:
符合預期~