定時任務Timer、Quartz實戰與詳解

 

配置文件java

<?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:p="http://www.springframework.org/schema/p"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context-3.0.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
        "
       default-autowire="byName">
    <!--   0 0 */2 * * ? 每兩小時、整點觸發 -->
    <!--   0 0/2 * * * ? 每兩分鐘  -->
    <!--   0/5 * * * * ? 每五秒鐘  -->
    <!--   0 15 10 * * ? 天天Y分X點觸發  -->
    <!-- 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時觸發.  -->
    <!--建立自定義任務類-->
    <bean id="startNotifyTask" class="com.alibaba.meeting.task.StartNotifyTask">
        <property name="source" value="${meeting.work.source}"></property>
        <property name="action" value="${meeting.work.action.notify}"></property>
        <property name="executeMachineName" value="${meeting.execute_machine_name}"></property>
    </bean>
    <!--建立任務詳情對象-->
    <bean id="jobStartNotify" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
        <!--注入任務類-->
        <property name="targetObject" ref="startNotifyTask"/>
        <!--任務類中執行的任務方法-->
        <property name="targetMethod">
            <value>run</value>
        </property>
        <property name="concurrent" value="false"/>
    </bean>
    <!--建立觸發器對象-->
    <bean id="cronStartNotify" class="org.springframework.scheduling.quartz.CronTriggerBean">
        <!--注入任務詳情對象-->
        <property name="jobDetail" ref="jobStartNotify"/>
        <!--注入corn表達式-->
        <property name="cronExpression">
            <value>0 0/1 * * * ?</value>
        </property>
    </bean>


    <!--建立自定義任務類-->
    <bean id="taskEndNotify" class="com.alibaba.meeting.task.EndNotifyTask">
        <property name="source" value="${meeting.work.source}"></property>
        <property name="action" value="${meeting.work.action.notifyEnd}"></property>
        <property name="executeMachineName" value="${meeting.execute_machine_name}"></property>
    </bean>
    <!--建立任務詳情對象-->
    <bean id="jobEndNotify" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
        <!--注入任務類-->
        <property name="targetObject" ref="taskEndNotify"/>
        <!--任務類中執行的任務方法-->
        <property name="targetMethod">
            <value>run</value>
        </property>
        <property name="concurrent" value="false"/>
    </bean>
    <!--建立觸發器對象-->
    <bean id="cronEndNotify" class="org.springframework.scheduling.quartz.CronTriggerBean">
        <!--注入任務詳情對象-->
        <property name="jobDetail" ref="jobEndNotify"/>
        <!--注入corn表達式-->
        <property name="cronExpression">
            <value>0 0/1 * * * ?</value>
        </property>
    </bean>


    <!--建立自定義任務類-->
    <bean id="taskCostSettle" class="com.alibaba.meeting.task.CostSettleTask">
        <property name="source" value="${meeting.work.source}"></property>
        <property name="action" value="${meeting.work.action.costsettle}"></property>
        <property name="executeMachineName" value="${meeting.execute_machine_name}"></property>
    </bean>
    <!--建立任務詳情對象-->
    <bean id="jobCostSettle" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
        <!--注入任務類-->
        <property name="targetObject" ref="taskCostSettle"/>
        <!--任務類中執行的任務方法-->
        <property name="targetMethod">
            <value>run</value>
        </property>
        <property name="concurrent" value="false"/>
    </bean>
    <!--建立觸發器對象-->
    <bean id="cronCostSettle" class="org.springframework.scheduling.quartz.CronTriggerBean">
        <!--注入任務詳情對象-->
        <property name="jobDetail" ref="jobCostSettle"/>
        <!--注入corn表達式-->
        <property name="cronExpression">
            <value>0 0/1 * * * ?</value>
        </property>
    </bean>

    <!--會議結束後生成訂單-->
    <bean id="createOrderTask" class="com.alibaba.meeting.task.CreateOrderTask">
        <property name="executeMachineName" value="${meeting.execute_machine_name}"></property>
    </bean>
    <bean id="jobcreateOrderTask" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
        <property name="targetObject" ref="createOrderTask"/>
        <property name="targetMethod">
            <value>run</value>
        </property>
        <property name="concurrent" value="false"/>
    </bean>
    <bean id="croncreateOrderTask" class="org.springframework.scheduling.quartz.CronTriggerBean">
        <property name="jobDetail" ref="jobcreateOrderTask"/>
        <property name="cronExpression">
            <value>0 31 * * * ?</value>
        </property>
    </bean>
    <bean id="croncreateOrderTask2" class="org.springframework.scheduling.quartz.CronTriggerBean">
        <property name="jobDetail" ref="jobcreateOrderTask"/>
        <property name="cronExpression">
            <value>0 1 */1 * * ?</value>
        </property>
    </bean>
    <!--建立任務調度對象-->
    <bean autowire="no" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
        <!--注入觸發器-->
        <property name="triggers">
            <list>
                <ref bean="cronStartNotify"/>
                <ref bean="cronEndNotify"/>
                <ref bean="cronCostSettle"/>
                <ref bean="croncreateOrderTask"/>
                <ref bean="croncreateOrderTask2"/>
            </list>
        </property>
    </bean>

</beans>

會議結束後生成訂單com.baizhi.meeting.task.CreateOrderTask.java文件web

package com.baizhi.meeting.task;

import com.baizhi.meeting.manager.BookInfoManager;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;

/**
 * Created by jrs on 16-7-25.
 */
public class CreateOrderTask extends CheckTask {
    private Logger logger = LoggerFactory.getLogger(CreateOrderTask.class);

    @Autowired
    private BookInfoManager bookInfoManager;

    public void run() {
        if(checkExecuteMachine()) {
            logger.info("CreateOrderTask start");
            bookInfoManager.createNotPayOrder();
            logger.info("CreateOrderTask end");
        }
    }
}

checkTask.javaspring

package com.baizhi.meeting.task;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.net.InetAddress;
import java.net.UnknownHostException;


public class CheckTask {

    private final Logger log = LoggerFactory.getLogger(CheckTask.class);
    private String executeMachineName;

    public String getExecuteMachineName() {
        return executeMachineName;
    }

    public void setExecuteMachineName(String executeMachineName) {
        this.executeMachineName = executeMachineName;
    }

    /**
     * 判斷執行的機器
     *
     * @return
     */
    public boolean checkExecuteMachine() {
        String currentMachineName = getCurrentMachineName();
        if (currentMachineName.equals(executeMachineName)) {
            return true;
        }
        log.info("不能在[" + currentMachineName + "] 這臺機器上執行任務,只能在[" + executeMachineName + "]上執行");
        return false;
    }

    private String getCurrentMachineName() {
        InetAddress addr;
        String hostName = "";
        try {
            addr = InetAddress.getLocalHost();
            hostName = addr.getHostName();
        } catch (UnknownHostException e) {
            return "";
        }
        return hostName;
    }
}

Timer定時任務

1. Java中專門作定時的工具類Timerapache

        1.注意:在測Java工具類Timer時,不能用JUnit測試來測。app

          緣由是:用JUnit發佈webService時,服務聽不下來(用main函數發佈)。JUint測試Timer定時,服務                         聽 不下來(用main函數發佈)。框架

        2.Timer這個類是java.util下的一個類,不是抽象類,也不是接口,因此能夠直接new類的對象,Timer             timer= new Timer();這樣就建立了一個定時任務的對象。函數

        3.對象中有一個schedule方法。要告訴對象,要調度那些任務,這些任務什時候開始執行,什麼時間              結束,時重複執行,執行幾回,是執行一次,仍是執行屢次。 工具

2. java中的工具類Timer,執行定時週期測試

        1.方法schedule參數的意思:this

            

            TimerTask(){}:定時執行的任務。

 

             new Date():開始執行時間。

             1000:週期執行的時間間隔。注意:時間單位爲毫秒。

 

3. 代碼解析

              

 

4. Timer工具類的缺點

      缺點:不能很好的解決項目中,複雜的業務,好比,某一天的某一整點運行,或者這一年的幾個時間點                   去運行。那麼就須要進行復雜時間的計算,但有是也無法達到效果。

5.Java項目直接轉爲web項目

                 

 

6. Timer與web項目的集成

            會把定時任務放到咱們的監聽器中執行。監聽器去實現servletContextListener接口,監聽器中有兩         個方法,一個是初始化ContextInitialized,一個是銷燬ContextDestoryed。因此定時任務要在初始化         方法中作。只要初始化了監聽器,就會執行定時任務。往後爲了類的複用。咱們本身寫一個MyTask類         去繼承TimerTask。

      1.自定義定時任務

            

 

        2.自定義監聽器

                

 

          3.監聽器在web.xml中的配置

                

 

7. 注意

                Quartz定時任務

1. Quartz是一個開源的定時任務框架.

2. What is Quartz?
              Job Scheduling(調度) Library(庫)

       Quartz is a richly(豐富地) featured, open source job scheduling library that can be integrated(集成) within virtually any Java application - from the smallest stand-alone(桌面級) application(應用) to the largest e-commerce(電商) system. Quartz can be used to create simple or complex schedules for executing tens, hundreds, or even tens-of-thousands of jobs; jobs whose tasks are defined as standard Java components that may execute virtually anything you may program them to do. The Quartz Scheduler includes many enterprise-class features, such as support for JTA transactions and clustering.

Quartz is freely usable, licensed under the Apache 2.0 license.

              

 

3.         Quartz在非web中的應用

       版本一:

      1.自定義任務類必須實現quartz規定的Job接口

                

 

      2.不多用測試

                  

 

      版本二:

      1.自定義任務類必須實現quartz規定的Job接口

                    

 

      2.經常使用測試

                     

 

      3.Cron表達式的生成

                       

 

                         

4.Quartz與Spring的整合

          1.環境的搭建,相關jar包

          2.自定義任務

                         

 

         3.Spring配置文件的配置

                        

 

4.測試代碼

                   

 

5.注意:

            1.自定義任務中,不能執行多個方法。

            2.必須爲每一個任務詳情對像在建立一次對象。

相關文章
相關標籤/搜索