一、
Quartz是Job scheduling(作業調度)領域的一個開源項目,Quartz既可以單獨使用也可以跟spring框架整合使用,在實際開發中一般會使用后者。使用Quartz可以開發一個或者多個定時任務,每個定時任務可以單獨指定執行的時間,例如每隔1小時執行一次、每個月第一天上午10點執行一次、每個月最后一天下午5點執行一次等。
官網:http://www.quartz-scheduler.org/
二、Quartz入門案例
1:創建maven工程quartzdemo,打包方式為war,導入jar包

坐標如下:
<!--quartz的基礎包--> <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>2.2.1</version> </dependency> <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz-jobs</artifactId> <version>2.2.1</version> </dependency>
<!--spring整合Quartz-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>5.0.2.RELEASE</version>
</dependency>
如果不想自己選擇,直接復制下面的依賴即可,只是一定要記得打war包,下面代碼沒有寫
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</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.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>5.0.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.2.1</version>
</dependency>
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz-jobs</artifactId>
<version>2.2.1</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<configuration>
<!-- 指定端口 -->
<port>8080</port>
<!-- 請求路徑 -->
<path>/</path>
</configuration>
</plugin>
</plugins>
</build>
2:自定義一個Job(Job任務類,這個類是將要定時執行的類,根據需求寫任務類,下面代碼只用於測試)
/** * 自定義Job */ public class JobDemo { public void run(){ System.out.println("job execute...,執行時間:"+new Date()); } }
3:提供Spring配置文件application-jobs.xml,配置自定義Job、任務描述、觸發器、調度工廠等
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <!-- 注冊自定義Job(任務類,也就是要定時執行的類)下面的class屬性填寫任務類的全限定類名 --> <bean id="jobDemo" class="com.baidu.job.JobDemo"></bean> <!-- 1:創建JobDetail對象,作用是負責通過反射調用指定的Job,注入目標對象,注入目標方法 --> <bean id="jobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> <!-- 注入目標對象(注入對象用ref屬性 輸入對象名稱) name屬性復制即可,表示注入的是對象--> <property name="targetObject" ref="jobDemo"/> <!-- 注入目標方法(注入方法用value屬性 輸入方法名稱)name屬性復制即可,表示注入的是方法 --> <property name="targetMethod" value="run"/> </bean> <!-- 2:注冊一個觸發器,指定任務觸發的時間 --> <bean id="myTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean"> <!-- 注入JobDetail --> <property name="jobDetail" ref="jobDetail"/> <!-- 指定觸發的時間,基於Cron表達式(0/10表示從0秒開始,每10秒執行一次) --> <property name="cronExpression"> <value>0/10 * * * * ?</value> </property> </bean> <!-- 3:注冊一個統一的調度工廠,通過這個調度工廠來確定調觸發器方案,調哪個觸發器 --> <bean id="scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <!-- List標簽中可以注入多個觸發器 --> <property name="triggers"> <list> <ref bean="myTrigger"/> </list> </property> </bean> </beans>
4:web.xml中定義。啟動web,自動加載spring容器。
<?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_3_0.xsd" id="WebApp_ID" version="3.0"> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:application-jobs.xml</param-value> </context-param> </web-app>
三、擴展0/10 * * * * ?”則表示每隔10秒執行一次任務類

cron表達式分為七個域,之間使用空格分隔。其中最后一個域(年)可以為空。每個域都有自己允許的值和一些特殊字符構成。使用這些特殊字符可以使我們定義的表達式更加靈活。
下面是對這些特殊字符的介紹:
逗號(,):指定一個值列表,例如使用在月域上1,4,5,7表示1月、4月、5月和7月
橫杠(-):指定一個范圍,例如在時域上3-6表示3點到6點(即3點、4點、5點、6點)
星號(*):表示這個域上包含所有合法的值。例如,在月份域上使用星號意味着每個月都會觸發
斜線(/):表示遞增,例如使用在秒域上0/15表示每15秒
問號(?):只能用在日和周域上,但是不能在這兩個域上同時使用,也不能同時指定日和周域,可能會有沖突,它表示不指定
井號(#):只能使用在周域上,用於指定月份中的第幾周的哪一天,例如6#3,意思是某月的第三個周五 (6=星期五,3意味着月份中的第三周)
L:某域上允許的最后一個值。只能使用在日和周域上。當用在日域上,表示的是在月域上指定的月份的最后一天。用於周域上時,表示周的最后一天,就是星期六
W:W 字符代表着工作日 (星期一到星期五),只能用在日域上,它用來指定離指定日的最近的一個工作日
如果,我是說如果,這樣還是看不懂的話,那么就自動生成吧!
訪問這個網址,自己琢磨

