1、Quartz定時任務
一、引入quartz
導入quartz.jar包,或者pom.xml 配置對應的依賴:java
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>1.8.6</version>
</dependency> web
二、 Web.xml配置
在Web項目web.xml中配置quartz的配置文件加載路徑:spring
<servlet>
<servlet-name>rest</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/classes/rest-servlet.xml,
/WEB-INF/classes/pyc-spring-quartz.xml
</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet> apache
三、寫具體的定時調度的任務:服務器
package andy.test.quartz.schedule;
/**
* @author Zhang,Tianyou
* @version:2014-12-11 下午12:00:24
*
* 一個測試的打印定時任務
*/
public class MyPrintSchedule {
public void printSomething(){
//內容就是打印一句話
System.out.println("this is andy schedule");
}
}架構
四、配置quartz的xml配置信息
Quartz配置文件名字能夠隨便,需和web.xml中的一致。學習
pyc-spring-quartz.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-3.0.xsd">
<!-- 添加調度的任務bean 配置對應的class-->
<bean id="myPrintSchedule" class="andy.test.quartz.schedule.MyPrintSchedule" />
<!--配置調度具體執行的方法-->
<bean id="myPrintDetail"
class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject" ref="myPrintSchedule" />
<property name="targetMethod" value="printSomething" />
<property name="concurrent" value="false" />
</bean>
<!--配置調度執行的觸發的時間-->
<bean id="myPrintTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail" ref="myPrintDetail" />
<property name="cronExpression">
<!-- 天天早上8點執行任務調度 -->
<value>0 0 8 * * ?</value>
</property>
</bean>
<!-- quartz的調度工廠 調度工廠只能有一個,多個調度任務在list中添加 -->
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<!-- 全部的調度列表-->
<ref local="myPrintTrigger" />
</list>
</property>
</bean>
</beans> this
這樣就實現了myPrint的任務調度,執行時間是天天早上8點執行一次,打印:
this is andy schedulespa
這句話。
quartz的功能是很是強大的,使用也很是的簡單方便,有事須要web啓動時,執行一些初始化的任務,這是咱們執行配置對應的執行調度的觸發時間就能完成。其具體實現以下:
<!--配置調度執行的觸發的時間-->
<bean id="myPrintTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail" ref="myPrintDetail" />
<property name="cronExpression">
<!-- 不重複計數,只執行一次 -->
<property name="repeatCount" value="0" />
</property>
</bean>
上面的配置完成了,服務器啓動執行的任務。只被執行一次。
2、Spring自帶的任務Task
Spring自帶的定時任務是在spring3以後支持,相比於quartz定時任務Spring相對於簡單,配置也很簡單。quartz功能比Spring Task強大,支持集羣功能。
一、在spring配置中添加task的schema
pring配置文件頭中添加命名空間及描述
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
//....其餘
xmlns:task="http://www.springframework.org/schema/task"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
//.....其餘
http://www.springframework.org/schema/task
http://www.springframework.org/schema/task/spring-task-4.1.xsd">
二、開啓掃描定時任務包
<context:component-scan base-package="org.andy.task" />
三、配置開啓任務
<task:annotation-driven />
若是任務比較多,能夠添加任務池
<task:scheduler id="scheduler" pool-size="5" />
<task:annotation-driven executor="executor" scheduler="scheduler" />
若是定時任務不少,能夠配置executor線程池,這裏executor的含義和java.util.concurrent.Executor是同樣的,pool-size的大小官方推薦爲5~10。scheduler的pool-size是ScheduledExecutorService線程池
四、Spring的POJO任務類
package org.andy.task;
import org.apache.log4j.Logger;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
/**
* 建立時間:2016年5月12日 下午3:48:38
*
* @author andy
* @version 2.2
*/
@Component("taskJob")
public class TaskJob {
private static final Logger LOG = Logger.getLogger(TaskJob.class);
//每分鐘的10秒執行
@Scheduled(cron = "10 * * * * ?")
public void job1(){
LOG.info("hello。。。。");
}
//每10秒執行一次
@Scheduled(fixedRate = 1000 * 1)
public void job(){
LOG.info("world");
}
}
3、定時配置
spring的task和quartz的任務格式都是同樣的。
Cron表達式包括下面7個字段並區別順序:秒0-59,分0-59,小時0-23,月內日期1-31,月1-12或者JAN-DEC,周內日期1-7或者SUN-SAT,年(可選字段)留空或者1970-2099而且經過特殊字符表示特殊意義,具體爲下:
斜線(/)字符表示增量值。例如,在秒字段中"5/15"表明從第5秒開始,每15秒一次。
問號(?)字符和字母L字符只有在月內日期和周內日期字段中可用。問號表示這個字段不包含具體值。因此,若是指定月內日期,能夠在周內日期字段中插入"?",表示周內日期值可有可無。這裏有個很蛋疼的設定,無關Quartz,而是Spring集成Quartz後,它本身加的一個約束,那就是:日期(1-31)和星期(SUN-SAT)二者,必須有一個是問號(?),系統在啓動的時候,Spring會檢查表達式,若是不符合它的規則,就會拋異常。因此在使用的時候這個地方必定要注意,而這個在Linux上執行Cron是沒有這個限制的。
字母L字符是last的縮寫。放在月內日期字段中,表示安排在當月最後一天執行。在周內日期字段中,若是"L"單獨存在,就等於"7",不然表明當月內周內日期的最後一個實例。因此"0L"表示安排在當月的最後一個星期日執行。
字母(W)字符把執行安排在最靠近指定值的工做日。把"1W"放在月內日期字段中,表示把執行安排在當月的第一個工做日內。
井號(#)字符爲給定月份指定具體的工做日實例。把"MON#2"放在周內日期字段中,表示把任務安排在當月的第二個星期一。
星號(*)字符是通配字符,表示該字段能夠接受任何可能的值、表達式例子。
例子:
"0 0 08 * * ?" 天天上午8點觸發
"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 ? 3 WED" 每一年三月的星期三的下午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 ? * 6L 2009-2019" 2009年至2019年的每個月的最後一個星期五上午10:15觸發
"0 15 10 ? * 6#3" 每個月的第三個星期五上午10:15觸發
感興趣的能夠本身來個人Java架構羣,能夠獲取免費的學習資料,羣號:855801563對Java技術,架構技術感興趣的同窗,歡迎加羣,一塊兒學習,相互討論。