常見的定時任務技術--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就行,會在控制檯上輸出的。
是否必須 | 允許值 | 特殊字元 | |
---|---|---|---|
秒 | 是 | 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 |
注意:
日與周,必須有一個是問號。否則就會有衝突。
舉例:
表示式意義
"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觸發