做業調度框架 Quartz 學習筆記(二) -- 簡單觸發器(SimpleTrigger)

簡單回顧一下上一節學習到的 "HelloWorld "java

1 建立一個job類,實現Job接口,覆蓋 public void execute(JobExecutionContext context) 方法,在方法中寫入你要執行的操做(數據導入/備份,輪詢檢查文件等)代碼node

2 建立一個主線程類, 得到 Scheduler 對象框架

    SchedulerFactory sf = new StdSchedulerFactory();
    Scheduler sched = sf.getScheduler(); ide

    得到要執行的對象  JobDetail job = newJob(HelloJob.class).withIdentity("job1", "group1").build();學習

    定義觸發器 Trigger trigger = newTrigger().withIdentity("trigger1", "group1").startAt(runTime).build();測試

    將任務和Trigger放入scheduler   : ui

        sched.scheduleJob(job, trigger);spa

    啓動 和 中止
    sched.start();  sched.shutdown(true);.net

    注意 給job 留有足夠長的時間,若是主線程類中止工做,job線程也會中止工做線程

 

---------------------------------------我是分割線--------------------------------------------------------

通過了 "HelloWorld" 以後,您老人家可能對 Quartz 有所瞭解,下面讓咱們繼續深刻,學習下Quartz 重複執行任務該怎麼作

簡單的說就是 觸發器(Trigger)的參數設置. 什麼? 觸發器(Trigger)不知道是什麼?

出門左轉  <<做業調度框架 Quartz 學習筆記(一)>>    不謝

仍是老套路,一個job 類,一個主線程類

SimpleJob.java

package net.itaem.annnodemo.anno.task.task1;

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

import java.text.SimpleDateFormat;
import java.util.Calendar;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: zhubo
 * Date: 2017-10-24
 * Time: 15:33
 */
public class SimpleJob implements Job {
    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
        // job 的名字
        String jobName = context.getJobDetail().getKey().getName();
        // 任務執行的時間
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy 年 MM 月 dd 日  HH 時 mm 分 ss 秒");
        String jobRunTime = dateFormat.format(Calendar.getInstance().getTime());
        // 輸出任務執行狀況
        System.out.println("任務 : " + jobName + " 在  " +jobRunTime + " 執行了 ");
    }
}

在這裏 對輸出 的日期進行了一小下 格式化,適應國人習慣.

其它沒什麼好說的 0.0

SimpleTriggerExample.java

package net.itaem.annnodemo.anno.task.task1;

import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;

import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: zhubo
 * Date: 2017-10-24
 * Time: 15:33
 */
public class SimpleTriggerExample {

    public static void main(String[] args) throws Exception {
        new SimpleTriggerExample().run();
    }

    public void run() throws Exception {
        // 日期格式化
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy 年 MM 月 dd 日  HH 時 mm 分 ss 秒");

        SchedulerFactory sf = new StdSchedulerFactory();
        Scheduler sched = sf.getScheduler();
        System.out.println("--------------- 初始化 -------------------");
        // 下一個第15秒 例:
        //           當前 10秒,則 執行時間爲15秒
        //           當前 16秒,則 執行時間爲30秒
        //           當前 33秒,則 執行時間爲45秒
        //           當前 48秒,則 執行時間爲00秒
        Date startTime = DateBuilder.nextGivenSecondDate(null, 15);


        // job1 將只會執行一次
        JobDetail job = JobBuilder.newJob(SimpleJob.class).withIdentity("job1", "group1").build();
        SimpleTrigger trigger = (SimpleTrigger) TriggerBuilder.newTrigger()
                .withIdentity("trigger1", "group1")
                .startAt(startTime).build();
        // 把job1 和 trigger加入計劃   .  ft:此任務要執行的時間
        Date ft = sched.scheduleJob(job, trigger);
        System.out.println(job.getKey().getName() + " 將在 : " + dateFormat.format(ft) + " 時運行.而且重複: "
                + trigger.getRepeatCount() + " 次, 每次間隔 "
                + trigger.getRepeatInterval() / 1000 + " 秒");

        // job2 將只會和執行一次(和job1同樣同樣的,吼~~)
        job = JobBuilder.newJob(SimpleJob.class).withIdentity("job2", "group1").build();
        trigger = (SimpleTrigger) TriggerBuilder.newTrigger()
                .withIdentity("trigger2", "group1").startAt(startTime).build();
        ft = sched.scheduleJob(job, trigger);
        System.out.println(job.getKey().getName() + " 將在 : " + dateFormat.format(ft) + " 時運行.而且重複: "
                + trigger.getRepeatCount() + " 次, 每次間隔 "
                + trigger.getRepeatInterval() / 1000 + " 秒");

        // job3 將執行11次(執行1次,重複10次) ,每10秒重複一次
        job = JobBuilder.newJob(SimpleJob.class).withIdentity("job3", "group1").build();
        trigger = TriggerBuilder.newTrigger()
                .withIdentity("trigger3", "group1")
                .startAt(startTime)
                .withSchedule(
                        SimpleScheduleBuilder.simpleSchedule()
                                .withIntervalInSeconds(10)// 重複間隔
                                .withRepeatCount(10))     // 重複次數
                .build();
        ft = sched.scheduleJob(job, trigger);
        System.out.println(job.getKey().getName()+ " 將在 : " + dateFormat.format(ft) + " 時運行.而且重複: "
                + trigger.getRepeatCount() + " 次, 每次間隔 "
                + trigger.getRepeatInterval() / 1000 + " 秒");


        // trigger3 改變了.  每隔10s重複.共重複2次
        // 此處說明 , 上面job3已經 設定了 trigger3 重複10次,每次10s
        //        在這裏又改變了 trigger3的設置,不會對之前構成影響,而是當作一個新的來處理
        trigger = TriggerBuilder.newTrigger()
                .withIdentity("trigger3", "group2")
                .startAt(startTime)
                .withSchedule(SimpleScheduleBuilder.simpleSchedule()
                                .withIntervalInSeconds(10)
                                .withRepeatCount(2))
                .forJob(job).build();
        ft = sched.scheduleJob(trigger);
        System.out.println(job.getKey().getName() + " 改變過trigger3屬性的job3 : " + dateFormat.format(ft) + " 時運行.而且重複: "
                + trigger.getRepeatCount() + " 次, 每次間隔 "
                + trigger.getRepeatInterval() / 1000 + " 秒");

        // job5 將在5分鐘後運行一次
        job = JobBuilder.newJob(SimpleJob.class).withIdentity("job5", "group1").build();
        trigger = (SimpleTrigger) TriggerBuilder.newTrigger()
                .withIdentity("trigger5", "group1")
                .startAt(DateBuilder.futureDate(5, DateBuilder.IntervalUnit.MINUTE)) // 設定5分鐘後運行
                .build();
        ft = sched.scheduleJob(job, trigger);
        System.out.println(job.getKey().getName()+ " 將在 : " + dateFormat.format(ft) + " 時運行.而且重複: "
                + trigger.getRepeatCount() + " 次, 每次間隔 "
                + trigger.getRepeatInterval() / 1000 + " 秒");

        // job6  每40s運行一次,沒有指定重複次數,則無下限的重複
        job = JobBuilder.newJob(SimpleJob.class).withIdentity("job6", "group1").build();
        trigger = TriggerBuilder.newTrigger()
                .withIdentity("trigger6", "group1")
                .startAt(startTime)
                .withSchedule(
                        SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(40)
                                .repeatForever()).build();
        ft = sched.scheduleJob(job, trigger);
        System.out.println(job.getKey().getName() + " 將在 : " + dateFormat.format(ft) + " 時運行.而且重複: "
                + trigger.getRepeatCount() + " 次, 每次間隔 "
                + trigger.getRepeatInterval() / 1000 + " 秒");

        // 全部的任務都被加入到了 scheduler中 ,但只有 schedulers.start(); 時纔開始執行
        sched.start();
        System.out.println("------- 開始調度 (調用.start()方法) ----------------");
        System.out.println("-------系統 啓動 的 時間 :" + dateFormat.format(new Date()));

        // 在 scheduled.start(); 以後,還能夠將 jobs 添加到執行計劃中
        // job7 將重複20次 ,每5分鐘重複一次
        job = JobBuilder.newJob(SimpleJob.class).withIdentity("job7", "group1").build();
        trigger = TriggerBuilder.newTrigger()
                .withIdentity("trigger7", "group1")
                .startAt(startTime)
                .withSchedule(
                        SimpleScheduleBuilder.simpleSchedule()
                                .withIntervalInMinutes(5) // 5分鐘
                                .withRepeatCount(20))     // 重複20次
                .build();
        ft = sched.scheduleJob(job, trigger);
        System.out.println(job.getKey().getName() + " 將在 : " + dateFormat.format(ft) + " 時運行.而且重複: "
                + trigger.getRepeatCount() + " 次, 每次間隔 "
                + trigger.getRepeatInterval() / 1000 + " 秒");

        // job8  能夠當即執行. 無trigger註冊
        job = JobBuilder.newJob(SimpleJob.class).withIdentity("job8", "group1")
                .storeDurably().build();
        sched.addJob(job, true);
        System.out.println("手動觸發  job8...(當即執行)");
        sched.triggerJob(JobKey.jobKey("job8", "group1"));

        System.out.println("------- 等待30 秒... --------------");

        try {
            Thread.sleep(30L * 1000L);
        } catch (Exception e) { }

        // job7 將立刻執行,重複10次,每秒一次
        System.out.println("-------  從新安排 ... --------------------");
        trigger = TriggerBuilder.newTrigger()
                .withIdentity("trigger7", "group1")
                .startAt(startTime)
                .withSchedule(
                        SimpleScheduleBuilder.simpleSchedule().withIntervalInMinutes(5)
                                .withRepeatCount(20)).build();

        ft = sched.rescheduleJob(trigger.getKey(), trigger);
        System.out.println("job7 被從新安排 在 : " + dateFormat.format(ft) +"  執行. \r   當前時間 :" + dateFormat.format(new Date())+"預約執行時間已過,任務當即執行");

        try {
            System.out.println("------- 等待5分鐘  ... ------------");
            Thread.sleep(300L * 1000L);
        } catch (Exception e) { }

        sched.shutdown(true);
        System.out.println("------- 調度已關閉 ---------------------");

        // 顯示一下  已經執行的任務信息
        SchedulerMetaData metaData = sched.getMetaData();
        System.out.println("~~~~~~~~~~  執行了 " + metaData.getNumberOfJobsExecuted() + " 個 jobs.");



    }
}

 定時任務開始後繼續註冊 與 手動出發啓動定時任務

package net.itaem.annnodemo.anno.task.task1;

import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.TimeUnit;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: zhubo
 * Date: 2017-10-24
 * Time: 15:33
 */
public class SimpleTriggerExampleTwo {

    public static void main(String[] args) throws Exception {
        new SimpleTriggerExampleTwo().run();
    }

    public void run() throws Exception {
        // 日期格式化
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy 年 MM 月 dd 日  HH 時 mm 分 ss 秒");

        SchedulerFactory sf = new StdSchedulerFactory();
        Scheduler sched = sf.getScheduler();
        System.out.println("--------------- 初始化 -------------------");

        Date startTime = DateBuilder.nextGivenSecondDate(null, 10);

        // job3 將執行11次(執行1次,重複10次) ,每10秒重複一次
        JobDetail job  = JobBuilder.newJob(SimpleJob.class).withIdentity("job3", "group1").build();
        SimpleTrigger trigger = TriggerBuilder.newTrigger()
                .withIdentity("trigger3", "group1")
                .startAt(startTime)
                .withSchedule(
                        SimpleScheduleBuilder.simpleSchedule()
                                .withIntervalInSeconds(3)// 重複間隔
                                .withRepeatCount(5))     // 重複次數
                .build();
        Date ft = sched.scheduleJob(job, trigger);
        System.out.println(job.getKey().getName()+ " 將在 : " + dateFormat.format(ft) + " 時運行.而且重複: "
                + trigger.getRepeatCount() + " 次, 每次間隔 "
                + trigger.getRepeatInterval() / 1000 + " 秒");


        sched.start();
        System.out.println("------- 開始調度 (調用.start()方法) ----------------");
        System.out.println("-------系統 啓動 的 時間 :" + dateFormat.format(new Date()));
        // 在 scheduled.start(); 以後,還能夠將 jobs 添加到執行計劃中
        // job7 將重複20次 ,每5分鐘重複一次
        job = JobBuilder.newJob(SimpleJob.class).withIdentity("job7", "group1").build();
        trigger = TriggerBuilder.newTrigger()
                .withIdentity("trigger7", "group1")
                .startAt(startTime)
                .withSchedule(
                        SimpleScheduleBuilder.simpleSchedule()
                                .withIntervalInSeconds(5) // 5分鐘
                                .withRepeatCount(3))     // 重複20次
                .build();
        ft = sched.scheduleJob(job, trigger);
        System.out.println(job.getKey().getName() + " 將在 : " + dateFormat.format(ft) + " 時運行.而且重複: "
                + trigger.getRepeatCount() + " 次, 每次間隔 "
                + trigger.getRepeatInterval() / 1000 + " 秒");


        // job8  能夠當即執行. 無trigger註冊
        job = JobBuilder.newJob(SimpleJob.class).withIdentity("job8", "group1")
                .storeDurably().build();
        sched.addJob(job, true);
        System.out.println("手動觸發  job8...(當即執行)");
        sched.triggerJob(JobKey.jobKey("job8", "group1"));
        Thread.sleep(20*1000L);
        // 顯示一下  已經執行的任務信息
        SchedulerMetaData metaData = sched.getMetaData();
        System.out.println("~~~~~~~~~~  執行了 " + metaData.getNumberOfJobsExecuted() + " 個 jobs.");

    }
}

從新安排觸發器

package net.itaem.annnodemo.anno.task.task1;

import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;

import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: zhubo
 * Date: 2017-10-24
 * Time: 16:04
 */
public class ReInject {

    public static void main(String[] args) throws Exception {
        new ReInject().run();
    }

    public void run() throws  Exception {
        // 日期格式化
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy 年 MM 月 dd 日  HH 時 mm 分 ss 秒");

        SchedulerFactory sf = new StdSchedulerFactory();
        Scheduler sched = sf.getScheduler();
        System.out.println("--------------- 初始化 -------------------");
        Date startTime = DateBuilder.nextGivenSecondDate(null, 10);
        sched.start();

        JobDetail job = JobBuilder.newJob(SimpleJob.class).withIdentity("job7", "group1").build();
        SimpleTrigger trigger = TriggerBuilder.newTrigger()
                .withIdentity("trigger7", "group1")
                .startAt(startTime)
                .withSchedule(
                        SimpleScheduleBuilder.simpleSchedule()
                                .withIntervalInMinutes(5) // 5分鐘
                                .withRepeatCount(20))     // 重複20次
                .build();
        Date ft = sched.scheduleJob(job, trigger);
        System.out.println(job.getKey().getName() + " 將在 : " + dateFormat.format(ft) + " 時運行.而且重複: "
                + trigger.getRepeatCount() + " 次, 每次間隔 "
                + trigger.getRepeatInterval() / 1000 + " 秒");


        // job7 將立刻執行,重複10次,每秒一次
        System.out.println("-------  從新安排 ... --------------------");
        trigger = TriggerBuilder.newTrigger()
                .withIdentity("trigger7", "group1")
                .startAt(startTime)
                .withSchedule(
                        SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(5)
                                .withRepeatCount(5)).build();

        ft = sched.rescheduleJob(trigger.getKey(), trigger);
        System.out.println("job7 被從新安排 在 : " + dateFormat.format(ft) +"  執行. \r   當前時間 :" + dateFormat.format(new Date())+"預約執行時間已過,任務當即執行");


    }
}

 

幾點說明:

1 DateBuilder.nextGivenSecondDate 的意思代碼中已經說明了,就是下一個你想要的時間,不懂的能夠本身測試一下

2 同一個任務能夠屢次註冊.

3 重複執行 須要設置

   trigger = newTrigger()
    .withIdentity("trigger3", "group1")
    .startAt(startTime)
    .withSchedule(
      simpleSchedule()
      .withIntervalInSeconds(10)// 重複間隔
      .withRepeatCount(10))     // 重複次數
      .build();

   若是須要一直重複:  

    trigger = newTrigger()
    .withIdentity("trigger6", "group1")
    .startAt(startTime)
    .withSchedule(
      simpleSchedule().withIntervalInSeconds(40)
        .repeatForever()).build();

4 無trigger註冊,表示任務當即執行 : sched.addJob(job, true);

5 // 在scheduler.start以後調用,能夠在job開始後從新定義trigger,而後從新註冊

    sched.rescheduleJob(trigger.getKey(), trigger);

這個Example 仍是比較簡單的,主要 就是Trigger的參數設置,多看看代碼,裏面有註釋的 0.0

本身動手試試吧

相關文章
相關標籤/搜索