1. 程式人生 > >Java Quartz實現定時功能

Java Quartz實現定時功能

     功能描述:在開發程式中很多時候會出現希望在某個時間點、一段時間後執行某個動作,此時即需要實現定時功能,也就是希望程式能夠自己進行監督,從而達到在希望的時間觸發相應的事件。

一、在maven中加入Quartz的依賴

   <dependencies>
        <!--定時排程-->
        <dependency>
            <groupId>org.quartz-scheduler</groupId>
            <artifactId>quartz</artifactId>
            <version>2.2.2</version>
        </dependency>


    </dependencies>

二、在web.xml檔案中整合quartz的配置檔案

<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/j2ee/web-app_3_0.xsd">

    <display-name>TestTime Web Application</display-name>

    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>
            /WEB-INF/spring-quartz.xml
        </param-value>
    </context-param>

    <!-- Servlet Filters ================================================ -->
    <!-- 編碼過濾器 -->
    <filter>
        <filter-name>encodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
        <init-param>
            <param-name>forceEncoding</param-name>
            <param-value>true</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>encodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <!--
         - Declare Spring context listener which sets up the Spring Application Context
         - containing all Cocoon components (and user defined beans as well).
         -->
    <!-- Spring監聽器 -->
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    <!-- 防止Spring記憶體溢位監聽器
    <listener>
        <listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class>
    </listener>-->

    <!--
      - Declare Spring request listener which sets up the required RequestAttributes
      - to support Springs and Cocoon custom bean scopes like the request scope or the
      - session scope.
      -->
    <listener>
        <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
    </listener>


    <!-- Servlet Configuration ========================================== -->
    <servlet>
        <display-name>TestTimeDispatcherServlet</display-name>
        <servlet-name>testTime-job-dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <!-- URL space mappings ============================================= -->
    <servlet-mapping>
        <servlet-name>testTime-job-dispatcher</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

    <!-- 預設首頁 -->
    <welcome-file-list>
        <welcome-file>/index.jsp</welcome-file>
    </welcome-file-list>

</web-app>


三、配置spring-quartz.xml檔案

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns="http://www.springframework.org/schema/beans"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    <description>Quartz Job Setting</description>


   <!-- 新建每個需要的配置-->
    <import resource="quartz/testPrint.xml"></import>
    <import resource="quartz/print.xml"></import>

    <!-- D.Quartz的排程工廠,排程工廠只能有一個,多個排程任務在list中新增 -->
    <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
        <property name="triggers">
            <list>
                <!-- 所有的排程列表-->
                <ref bean="testTrigger"/>
                <ref bean="printTrigger"/>
            </list>
        </property>
    </bean>


</beans>


四、配置print.xml檔案

       其中MyPrintJob表示的是定時任務的類;屬性targetObject表示指向那個任務類;屬性targetMethod表任務類的任務方法。屬性concurrent表示:對於相同的JobDetail,當指定多個Trigger時, 很可能第一個job完成之前,第二個job就開始了。當concurrent設為false,多個job不會併發執行,第二個job將不會在第一個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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <!-- A.配置排程的任務對應bean的id和自定義class-->
    <bean id="print" class="com.testTime.job.schedule.test.MyPrintJob"/>

    <!-- B.配置排程任務對應的bean的id和執行的方法,作業不併發排程-->
    <bean id="printDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
        <property name="targetObject" ref="print"/>
        <property name="targetMethod" value="print"/>
        <property name="concurrent" value="false"/>
    </bean>

    <!-- C.配置排程任務執行的觸發的時間-->
    <bean id="printTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
        <property name="jobDetail" ref="printDetail"/>
        <property name="cronExpression">
            <!-- 秒 分 時 月的某天 月 星期的某天 年 除了年都是必須值 -->
            <!-- 每3秒執行任務排程 -->
            <value>0/3 * * * * ?</value>
        </property>
    </bean>
</beans>
下圖是cronExpression的具體意義。
/** 
     * ---------------------------- 
     * 【位置說明】: 
     *  1 - 秒(0–59) 
     *  2 - 分(0–59) 
     *  3 - 時(0–23) 
     *  4 - 日(1–31) 
     *  5 - 月(1–12) 
     *  6 - 星期(SUN–SAT or 1–7) 
     *  7 - 年(可選, 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時觸發 
     * @return 
     */  


四、具體任務類和任務方法的實

package com.testTime.job.schedule.test;


import com.testTime.job.utils.DateFormatUtils;
import com.testTime.job.utils.LogUtils;
import com.testTime.job.utils.date.DateUtils;


public class MyPrintJob {

     public void print(){
        Integer current = DateUtils.getCurrentTimestamp();
        LogUtils.trace(DateFormatUtils.format(current,"yyyy-MM-dd"));
    }

}