1. 程式人生 > 實用技巧 >常見的定時任務技術--Quartz [kwɔːts] 框架(任務排程框架)

常見的定時任務技術--Quartz [kwɔːts] 框架(任務排程框架)

                                      Quartz框架(任務排程框架)


步驟:

1.一個maven轉成web的專案中 新增依賴

2.編寫任務類(就是普通的類,裡面定義一個普通的任務方法)

3.編寫Spring整合Quartz配置

4.啟動服務

實現:

1.一個maven轉成web的專案中 新增依賴

<dependencies> 
    <!--定時任務 -->  
    <dependency> 
      <groupId>org.quartz-scheduler</groupId>  
      <artifactId>quartz</artifactId>  
      <version>2.2.3</version> 
    </dependency>
<!-- Spring框架 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.0.2.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>5.0.2.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> <version>5.0.2.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>5.0.2.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> <version>5.0.2.RELEASE</version> </dependency> <!--日誌包--> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.7.25</version> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency> </dependencies>

  2.編寫任務類

/**
 * 任務類
 */
public class MyJob {

    /**
     * 任務方法
     */
    public void task(){
        System.out.println("任務觸發了..."+new Date());
    }

}

  3.編寫Spring整合Quartz配置

先在web.xml裡面配置一個  監聽器,來載入quartz配置(applicationContext-task.xml)

再在applicationContext-task.xml裡面配置(配置任務、配置觸發器、配置任務排程物件)。

  web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://java.sun.com/xml/ns/javaee"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
	version="2.5">

	
	<!--監聽器載入quartz配置-->
	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>classpath:applicationContext-task.xml</param-value>
	</context-param>
	<listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener>
	
	
</web-app>

  applicationContext-task.xml:

<?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/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <!--定時任務: 在什麼時候做什麼  -->

    <!--1.建立任務物件:JobDetail   做什麼 -->
    <!--建立執行任務目標物件-->
    <bean id="myJob" class="cn.itcast.quartz.MyJob"/>
    <bean id="jobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
        <!--執行的任務物件-->
        <property name="targetObject" ref="myJob"/>
        <!--執行的方法-->
        <property name="targetMethod" value="task"/>
    </bean>

    <!--2.建立觸發器:Trigger   什麼時候-->
    <bean id="trigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
        <!--設定cron表示式   每隔5秒執行1次任務-->
        <property name="cronExpression" value="0/5 * * * * ? *"/>
        <!--關聯任務-->
        <property name="jobDetail" ref="jobDetail"/>
    </bean>


    <!--3.建立任務排程物件:Scheduler   在什麼時候做什麼-->
    <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
        <!--關聯觸發器-->
        <property name="triggers">
            <array>
                <ref bean="trigger"/>
            </array>
        </property>
    </bean>

</beans>

  

4.啟動服務

直接啟動該tomcat就行,會在控制檯上輸出的。


Quartz 任務排程表示式語法

Quartz cron表示式支援七個域:

名稱是否必須允許值特殊字元
0-59 , - * /
0-59 , - * /
0-23 , - * /
1-31 , - * ? / L W C
1-12 或 JAN-DEC , - * /
1-7 或 SUN-SAT(從週日開始,1是週日,7是週六) , - * ? / L C #
否(可以省略) 空 或 1970-2099

注意:

日與周,必須有一個是問號。否則就會有衝突。

月份和星期的名稱是不區分大小寫的。FRI 和 fri 是一樣的。

舉例:

表示式意義
"0 0 12 * * ?" 每天中午12點觸發
"0 15 10 ? * *" 每天上午10:15觸發
"0 15 10 * * ?" 每天上午10:15觸發
"0 15 10 * * ? *" 每天上午10:15觸發
"0 15 10 * * ? 2005" 2005年的每天上午10:15觸發
"0 * 14 * *?" 在每天下午2點到下午2:59期間的每1分鐘觸發
"0 0/5 14 * *?" 在每天下午2點到下午2:55期間的每5分鐘觸發
"0 0/5 14,18 ** ?" 在每天下午2點到2:55期間和下午6點到6:55期間的每5分鐘觸發
"0 0-5 14 * *?" 在每天下午2點到下午2:05期間的每1分鐘觸發
"0 10,44 14 ? 3WED" 每年三月的星期三的下午2:10和2:44觸發
"0 15 10 ? *MON-FRI" 週一至週五的上午10:15觸發
"0 15 10 15 *?" 每月15日上午10:15觸發
"0 15 10 L * ?" 每月最後一日的上午10:15觸發
"0 15 10 ? * 6L" 每月的最後一個星期五上午10:15觸發
"0 15 10 ? * 6L2002-2005" 2002年至2005年的每月的最後一個星期五上午10:15觸發
"0 15 10 ? *6#3" 每月的第三個星期五上午10:15觸發