Spring的任務調度服務實例講解

記的以前在做一家人才招聘網站時遇到的一個問題,因爲白天的流量非常大爲了減輕網站的壓力所以客戶要求一些不是太急手的任務(如,給註冊用戶發送郵件、清理日常垃圾信息等等)都放在凌晨流量最小的時間段去執行,當時我們藉助java.util.Timer來實現的。但是對於更加複雜的任務調度Timer就不太容易了,後來瞭解了Quartz(OpenSymphony的提供任務調務類庫)可以大大彌補Timer的不足可以使開發者能夠完成各種複雜的任務調度。Spring又對其提供了很好的支持使得開發者不用另外去學習這套全新的類庫就能很方便的使用。

下面提供一個實例來講解:

1. 首先把spring.jar包放到classpath下 ,其次quartz-all-1.5.2.jar這個包也是不能少的

2. 編輯spring配製文件,ApplicationContext.xml內容如下:

Java代碼 複製代碼 收藏代碼
  1. <?xml version="1.0" encoding="UTF-8"?>   
  2. <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "spring-beans.dtd" >   
  3. <beans>   
  4.      <!—要調度的對象-->   
  5.     <bean id="testQuarz" class="springtimer.TestQuarz" />   
  6.   
  7.     <!--定義定時執行testQuarz 這個bean中的sayHello()方法-->   
  8.     <bean id="helloworldTask"    class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">   
  9.         <property name="targetObject">   
  10.             <ref bean="testQuarz" />   
  11.         </property>   
  12.         <property name="targetMethod">   
  13.             <value>sayHello</value>   
  14.         </property>   
  15.     </bean>   
  16.   
  17.     <!--觸發器的bean的設置,在這裏我們設置了我們要觸發的jobDetail是哪個。這裏我們定義了要觸發的jobDetail是helloworldTask,即觸發器去觸發哪個bean..並且我們還定義了觸發的時間:每天5:17pm-->   
  18.     <bean id="cronTrigger"  
  19.         class="org.springframework.scheduling.quartz.CronTriggerBean">   
  20.         <property name="jobDetail">   
  21.             <ref bean=" helloworldTask " />   
  22.         </property>   
  23.         <property name="cronExpression">   
  24.             <!-- 關鍵在配置此表達式 -->   
  25.             <value>0 17 17 * * ?</value>   
  26.         </property>   
  27.     </bean>   
  28.   
  29.     <!--管理觸發器的總設置,管理我們的觸發器列表,可以在bean的list中放置多個觸發器。    
  30.     -->   
  31.     <bean autowire="no"  
  32.         class="org.springframework.scheduling.quartz.SchedulerFactoryBean">   
  33.         <property name="triggers">   
  34.             <list>   
  35.                 <ref local="cronTrigger" />   
  36.             </list>   
  37.         </property>   
  38.     </bean>   
  39. </beans>  
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "spring-beans.dtd" >
<beans>
     <!—要調度的對象-->
	<bean id="testQuarz" class="springtimer.TestQuarz" />

	<!--定義定時執行testQuarz 這個bean中的sayHello()方法-->
	<bean id="helloworldTask"	class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
		<property name="targetObject">
			<ref bean="testQuarz" />
		</property>
		<property name="targetMethod">
			<value>sayHello</value>
		</property>
	</bean>

	<!--觸發器的bean的設置,在這裏我們設置了我們要觸發的jobDetail是哪個。這裏我們定義了要觸發的jobDetail是helloworldTask,即觸發器去觸發哪個bean..並且我們還定義了觸發的時間:每天5:17pm-->
	<bean id="cronTrigger"
		class="org.springframework.scheduling.quartz.CronTriggerBean">
		<property name="jobDetail">
			<ref bean=" helloworldTask " />
		</property>
		<property name="cronExpression">
			<!-- 關鍵在配置此表達式 -->
			<value>0 17 17 * * ?</value>
		</property>
	</bean>

	<!--管理觸發器的總設置,管理我們的觸發器列表,可以在bean的list中放置多個觸發器。 
	-->
	<bean autowire="no"
		class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
		<property name="triggers">
			<list>
				<ref local="cronTrigger" />
			</list>
		</property>
	</bean>
</beans>


3.以下是被調度的類代碼
Java代碼 複製代碼 收藏代碼
  1. package springtimer;   
  2.   
  3. ublic class TestQuarz {   
  4.   
  5.  public void sayHello() {   
  6.    System.out.println("HelloWorld! ");   
  7.  }   
 package springtimer;

public class TestQuarz {

  public void sayHello() {
    System.out.println("HelloWorld! ");
  }
}


4,提供測試類

Java代碼 複製代碼 收藏代碼
  1. public class TestHello {   
  2.   
  3. public static void main(String[] args) {   
  4. // 只要加載配置文件就可以了,   
  5. ApplicationContext context = new ClassPathXmlApplicationContext("ApplicationContext.xml");   
  6. System.out.println("*****完畢******");   
  7. }  
public class TestHello {

public static void main(String[] args) {
// 只要加載配置文件就可以了,
ApplicationContext context = new ClassPathXmlApplicationContext("ApplicationContext.xml");
System.out.println("*****完畢******");
}


5,Ok自已可以設置sping-config文件中<value>0 17 17 * * ?</value>的調度表達式,可以測試啦!

6, 下面簡單的介紹一下cron expressions(調度表達式)

格式列表:
Java代碼 複製代碼 收藏代碼
  1. Field Name  | Mandatory?    | Allowed Values    | Allowed Special Characters   
  2. Seconds          |  YES        |  0-59           |  , - * /   
  3. Minutes          |  YES        |  0-59           |  , - * /   
  4. Hours            |  YES        |  0-23           |  , - * /   
  5. Day of month    |  YES         |  1-31           |  , - * ? / L W C   
  6. Month            |  YES        |  1-12 or JAN-DEC   |  , - * /   
  7. Day of week |  YES         |  1-7 or SUN-SAT    |  , - * ? / L C #   
  8. Year             |  NO         |  empty, 1970-2099  |  , - * /  
Field Name	| Mandatory?    | Allowed Values	| Allowed Special Characters
Seconds	         |  YES	       |  0-59	         |  , - * /
Minutes	         |  YES	       |  0-59	         |  , - * /
Hours	         |  YES	       |  0-23	         |  , - * /
Day of month	|  YES	       |  1-31	         |  , - * ? / L W C
Month	         |  YES	       |  1-12 or JAN-DEC	|  , - * /
Day of week	|  YES	       |  1-7 or SUN-SAT	|  , - * ? / L C #
Year	         |  NO	       |  empty, 1970-2099	|  , - * /


至於詳細的解釋你一看例子就會明白

例子列表如下:
表達式 解釋
0 0 12 * * ? 在每天中午12:00觸發
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:00至2:59之間每分鐘觸發一次
0 0/5 14 * * ? 每天在下午2:00至2:59之間每5分鐘觸發一次
0 0/5 14,18 * * ? 每天在下午2:00至2:59和6:00至6:59之間的每5分鐘觸發一次
0 0-5 14 * * ? 每天在下午2:00至2:05之間每分鐘觸發一次
0 10,44 14 ? 3 WED 每三月份的星期三在下午2:00和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 2002-2005 在2002, 2003, 2004 and 2005年的每個月的最後一個星期五的上午10:15觸發
0 15 10 ? * 6#3 在每個月的第三個星期五的上午10:15觸發
0 0 12 1/5 * ? 從每月的第一天起每過5天的中午12:00時觸發
0 11 11 11 11 ? 在每個11月11日的上午11:11時觸發.

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