使用Spring配置quartz(邏輯清晰)

一、前言

  看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);
    }

結果:在這裏插入圖片描述

符合預期~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章