1. 程式人生 > >springMVC + quartz實現定時器(任務排程器)

springMVC + quartz實現定時器(任務排程器)

首先我們要知道任務排程器(定時器)有幾種,這邊我會寫三種

第一種是基於JDK的本身的一個定時器(優點:簡單,缺點:滿足不了複雜的需求)

複製程式碼
package com.timer1;

import java.util.Date;
import java.util.TimerTask;
/**
 * jdk自帶的定時器   不需要引入任何的jar  
 * @author Administrator
 */
public class JdkTimerTask extends TimerTask {
    int a = 1;
    @Override
    public void run() {
        System.out.println("我的定時任務    " + new Date() + "     " + a++ );
    }
}
複製程式碼

測試類

複製程式碼
package com.timer1;

import java.util.Timer;

public class TestTimerTask {

    public static void main(String[] args) {
        // 新建一個 timer 
        Timer t = new Timer("定時任務");
        //  執行我們的定時任務   第一個引數是 定時任務物件    0 是立即開始   3000 每隔3秒鐘執行一次
        t.schedule(new JdkTimerTask(), 0 , 3000);
    }
}
複製程式碼

 

 

 

第二種是基於 Quartz的純程式碼去實現的,  需要下載Quartz的jar  ,而 jar的版本不一樣實現的方式又不一樣

以下程式碼是基於  quartz-all-1.6.1.jar 版本  和 quartz-2.2.3-distribution(quartz-2.2.3、quartz-jobs-2.2.3) 去實現兩種方式的,兩種只能選擇一種。

複製程式碼
package com.timer3;

import java.util.Date;

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

/**
 * 定時任務
 * @author Administrator
 */
public class QuartzTimer implements Job {
    int a = 1;
    
    @Override
    public void execute(JobExecutionContext arg0) throws JobExecutionException {
        System.out.println("我的quartz定時任務" +  new Date() + "     " + a++);

    }

}
複製程式碼

以下是測試方式(注:因為兩種模式寫在一起了 所以jar包匯入可能不對,需要以引用的jar的版本為準)

複製程式碼
package com.timer3;

import java.text.ParseException;
import java.util.Date;

import org.quartz.CronExpression;
import org.quartz.CronTrigger;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SchedulerFactory;
import org.quartz.SimpleTrigger;
import org.quartz.Trigger;
import org.quartz.impl.StdSchedulerFactory;

public class TestQuartzTimer {
    
    public static void main(String[] args) throws SchedulerException, ParseException {
        /**
         * jar 版本  quartz-all-1.6.1.jar
         */
        //  新建一個定時任務處理類 jobDetail
        //JobDetail jobDetail = new JobDetail("quartzTimer","quartzTimerGroup" , QuartzTimer.class);
        
        // 建立定時器觸發器
        /*SimpleTrigger simpleTrigger = new SimpleTrigger("quartzTimerTrigger", "quartzTimerTriggerGroup");
        //  什麼時間點執行      new Date()立即啟動
        simpleTrigger.setStartTime(new Date());
        // 執行多少次    10 次
        simpleTrigger.setRepeatCount(10);
        //  每隔多少秒執行一次   1000是代表1秒
        simpleTrigger.setRepeatInterval(1000);*/
        
        // 表示式的觸發器   兩個觸發器只需要一個就好了。
        /*CronTrigger cronTrigger = new CronTrigger("quartzTimerCronTrigger", "quartzTimerCronTriggerGroup");
        // 新建一個表示式
        CronExpression cronExpression = new CronExpression("0/5 32/1 0-23 * * ? *");
        // 將表示式放入 觸發器
        cronTrigger.setCronExpression(cronExpression);
        
        //  新建一個計劃共工廠
        StdSchedulerFactory stdSchedulerFactory = new StdSchedulerFactory();
        //  獲取到一個計劃任務
        Scheduler scheduler = stdSchedulerFactory.getScheduler();
        //  將定時器任務處理類和觸發器結合在一起
        scheduler.scheduleJob(jobDetail, cronTrigger);
        // 啟動觸發器
        scheduler.start();*/
        
        
        //quartz 2.X版本以上做法 ++++++++++++++++++++++++++++++++++++++++++++++++
        /**
         * quartz-2.2.3-distribution(quartz-2.2.3、quartz-jobs-2.2.3)
         */
        // 通過 schedulerFactory 獲取一個排程器
        /*SchedulerFactory sf = new StdSchedulerFactory();
        Scheduler sched = sf.getScheduler();

        // 建立 jobDetail 例項,繫結 Job 實現類
        // 指明 job 的名稱,所在組的名稱,以及繫結 job 類
        JobDetail job = JobBuilder.newJob(QuartzTimer.class).withIdentity("job1", "group1").build();

        // 定義排程觸發規則

        // SimpleTrigger,從當前時間的下 1 秒開始,每隔 1 秒執行 1 次,重複執行 2 次
        Trigger trigger = TriggerBuilder.newTrigger()
                // 指明 trigger 的 name 和 group
                .withIdentity("trigger1", "group1")
                // 從當前時間的下 1 秒開始執行,預設為立即開始執行(.startNow())
                .startAt(DateBuilder.evenSecondDate(new Date()))
                .withSchedule(SimpleScheduleBuilder.simpleSchedule()
                        .withIntervalInSeconds(1) // 每隔 1 秒執行 1 次
                        .withRepeatCount(2)) // 重複執行 2 次,一共執行 3 次
                .build();


        // corn 表示式,先立即執行一次,然後每隔 5 秒執行 1 次
        Trigger trigger = TriggerBuilder.newTrigger()
                .withIdentity("trigger1", "group1")
                .withSchedule(CronScheduleBuilder.cronSchedule("*\/5 * * * * ?"))
                .build();


        // 把作業和觸發器註冊到任務排程中
        sched.scheduleJob(job, trigger);

        // 啟動計劃程式(實際上直到排程器已經啟動才會開始執行)
        sched.start();

        // 等待 10 秒,使我們的 job 有機會執行
        //Thread.sleep(10000);

        // 等待作業執行完成時才關閉排程器
        //sched.shutdown(true);
        */
    }
}
複製程式碼

springMVC +  Quartz 配置檔案的兩種實現方式實現 需要用(quartz-2.2.3-distribution(quartz-2.2.3、quartz-jobs-2.2.3)  jar包

第一種 需要繼承QuartzJobBean

複製程式碼
package com.timer4;

import java.util.Date;

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.SchedulerException;
import org.quartz.spi.JobFactory;
import org.quartz.spi.TriggerFiredBundle;
import org.springframework.scheduling.quartz.QuartzJobBean;

/**
 * 定時任務
 * @author Administrator
 */
public class QuartzTimer extends QuartzJobBean  {
    
    @Override
    protected void executeInternal(JobExecutionContext arg0) throws JobExecutionException {
        System.out.println("我的Spring管理quartz定時任務" +  new Date());
        
    }

}
複製程式碼

spring中的配置方式

複製程式碼
<!-- 第一種  -->
    <!-- 任務排程處理類工廠 -->
    <bean id="jobDetail" class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
        <property name="jobClass" value="com.timer4.QuartzTimer"></property>
    </bean>
    <!-- 表示式觸發器工廠 -->
    <bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
        <property name="jobDetail" ref="jobDetail"></property>
        <property name="cronExpression" value="0/5 13/1 0-23 * * ? *"></property>
    </bean>
    <!-- 任務排程計劃工廠 -->
    <bean id="scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
        <property name="triggers">
            <list>
                <ref bean="cronTrigger"/>                
            </list>
        </property>
    </bean>
複製程式碼

第二種不需要繼承任何類

複製程式碼
package com.timer4;

import java.util.Date;

public class QuartzTimer2 {

    protected void execute()  {  
        System.out.println("我的Spring管理quartz定時任務2222" +  new Date()); 
    }
}
複製程式碼

spring 中配置方式

複製程式碼
<!-- 第二種     要排程的物件--> 
    <bean id="jobBean" class="com.timer4.QuartzTimer2" />  
    <bean id="jobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">  
        <property name="targetObject" ref="jobBean" />  
        <property name="targetMethod" value="execute" />  
        <!--將併發設定為false-->  
        <property name="concurrent" value="false" />  
    </bean>  
  
    <bean id="trigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">  
        <property name="jobDetail" ref="jobDetail" />  
        <!--表示式,我的是每 5s 執行一次-->  
        <property name="cronExpression" value="0/5 * * * * ?" />  
    </bean>  
  
    <!--  總管理類如果將lazy-init='false'那麼容器啟動就會執行排程程式   -->  
    <bean id="startQuertz" class="org.springframework.scheduling.quartz.SchedulerFactoryBean" lazy-init="false" >  
        <property name="triggers">  
            <list>  
                <!--作業排程器,list下可加入其他的排程器-->  
                <ref bean="trigger" />  
            </list>  
        </property>  
    </bean> 
複製程式碼

 

Spring + SpringMVC + Quartz   jar下載地址:http://pan.baidu.com/s/1nuHIUvv   ,密碼 :28ar