quartz2.3.0(二)觸發器Trigger花式Scheduler調度job

任務類java

 1 package org.quartz.examples.example2;
 2 
 3 import java.util.Date;
 4 
 5 import org.slf4j.Logger;
 6 import org.slf4j.LoggerFactory;
 7 import org.quartz.Job;
 8 import org.quartz.JobExecutionContext;
 9 import org.quartz.JobExecutionException;
10 import org.quartz.JobKey;
11 
12 /**
13  * 任務job
14  */
15 public class SimpleJob implements Job {
16 
17     private static Logger LOG = LoggerFactory.getLogger(SimpleJob.class);
18 
19     // 必需要有public修飾的無參構造函數
20     public SimpleJob() {
21     }
22 
23     // 任務執行方法
24     public void execute(JobExecutionContext context) throws JobExecutionException {
25         JobKey jobKey = context.getJobDetail().getKey();  //jobKey長這樣:group1.job6 26         LOG.info("執行任務。SimpleJob says: " + jobKey + " executing at " + new Date());
27     }
28 
29 }

 

調度管理類函數

 

package org.quartz.examples.example2;

import static org.quartz.DateBuilder.futureDate;
import static org.quartz.JobBuilder.newJob;
import static org.quartz.JobKey.jobKey;
import static org.quartz.SimpleScheduleBuilder.simpleSchedule;
import static org.quartz.TriggerBuilder.newTrigger;

import org.quartz.DateBuilder;
import org.quartz.DateBuilder.IntervalUnit;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SchedulerFactory;
import org.quartz.SchedulerMetaData;
import org.quartz.SimpleTrigger;
import org.quartz.impl.StdSchedulerFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.Date;

/**
 * 這個例子代表,只要觸發器運用的好,job任務能夠被花式執行
 */
public class SimpleTriggerExample {
    Logger LOG = LoggerFactory.getLogger(SimpleTriggerExample.class);

    public void run() throws Exception {

        // 初始化一個調度工廠,並實例化一個調度類
        SchedulerFactory sf = new StdSchedulerFactory();
        Scheduler scheduler = sf.getScheduler();
        // 第一個參數:null就是默認當前時間,也能夠指定時間
        // 第二個參數:把一分鐘按15進行劃分,也就是60/15等份。
        // 舉例:當前時間是10:26:04,那麼startTime就是10:26:15。當前時間是10:26:31,那麼startTime就是10:26:45。
        Date startTime = DateBuilder.nextGivenSecondDate(null, 15);

        // ========================================================
        // ============ job1 任務綁定到group1 組中 ==================
        // ========================================================
        JobDetail job = newJob(SimpleJob.class).withIdentity("job1", "group1").build();
        // 實例化一個觸發器,命名爲trigger1,並綁定到一個名爲group1的組中,Job類運行開始時間爲runTime(下一分鐘)
        SimpleTrigger trigger = (SimpleTrigger) newTrigger().withIdentity("trigger1", "group1").startAt(startTime)
                .build();
        Date date = scheduler.scheduleJob(job, trigger);
        LOG.info(job.getKey() + " will run at: " + date + " and repeat: " + trigger.getRepeatCount() + " times, every "
                + trigger.getRepeatInterval() / 1000 + " seconds");

        // ========================================================
        // ============ job2 任務綁定到group1 組中 ==================
        // ========================================================
        job = newJob(SimpleJob.class).withIdentity("job2", "group1").build();
        trigger = (SimpleTrigger) newTrigger().withIdentity("trigger2", "group1").startAt(startTime).build();
        date = scheduler.scheduleJob(job, trigger);
        LOG.info(job.getKey() + " will run at: " + date + " and repeat: " + trigger.getRepeatCount() + " times, every "
                + trigger.getRepeatInterval() / 1000 + " seconds");

        // ====================================================================
        // ============ job3 任務綁定到group1 組中,運行一次每間隔10秒重複1次,總共重複10次
        // ====================================================================
        job = newJob(SimpleJob.class).withIdentity("job3", "group1").build();
        trigger = newTrigger().withIdentity("trigger3", "group1").startAt(startTime)
                .withSchedule(simpleSchedule().withIntervalInSeconds(10).withRepeatCount(10)).build();
        date = scheduler.scheduleJob(job, trigger);
        LOG.info(job.getKey() + " will run at: " + date + " and repeat: " + trigger.getRepeatCount() + " times, every "
                + trigger.getRepeatInterval() / 1000 + " seconds");
        // ====================================================================
        // ============ job3 任務綁定到group2 組中,將被另外一個觸發器調度,這一次將以70秒的間隔重複兩次
        // ====================================================================
        trigger = newTrigger().withIdentity("trigger3", "group2").startAt(startTime)
                .withSchedule(simpleSchedule().withIntervalInSeconds(10).withRepeatCount(2)).forJob(job).build();

        date = scheduler.scheduleJob(trigger);
        LOG.info(job.getKey() + " will [also] run at: " + date + " and repeat: " + trigger.getRepeatCount()
                + " times, every " + trigger.getRepeatInterval() / 1000 + " seconds");

        // ====================================================================
        // ============ job4 將被執行6次,執行一次重複5次,每次間隔10秒
        // ====================================================================
        job = newJob(SimpleJob.class).withIdentity("job4", "group1").build();
        trigger = newTrigger().withIdentity("trigger4", "group1").startAt(startTime)
                .withSchedule(simpleSchedule().withIntervalInSeconds(10).withRepeatCount(5)).build();
        date = scheduler.scheduleJob(job, trigger);
        LOG.info(job.getKey() + " will run at: " + date + " and repeat: " + trigger.getRepeatCount() + " times, every "
                + trigger.getRepeatInterval() / 1000 + " seconds");

        // ====================================================================
        // ============ job5 將在5分鐘後執行一次
        // ====================================================================
        job = newJob(SimpleJob.class).withIdentity("job5", "group1").build();
        trigger = (SimpleTrigger) newTrigger().withIdentity("trigger5", "group1")
                .startAt(futureDate(5, IntervalUnit.MINUTE)).build();
        date = scheduler.scheduleJob(job, trigger);
        LOG.info(job.getKey() + " will run at: " + date + " and repeat: " + trigger.getRepeatCount() + " times, every "
                + trigger.getRepeatInterval() / 1000 + " seconds");

        // ====================================================================
        // ============ job6 將被無限期地執行,每隔40秒執行一次
        // ====================================================================
        job = newJob(SimpleJob.class).withIdentity("job6", "group1").build();
        trigger = newTrigger().withIdentity("trigger6", "group1").startAt(startTime)
                .withSchedule(simpleSchedule().withIntervalInSeconds(40).repeatForever()).build();
        date = scheduler.scheduleJob(job, trigger);
        LOG.info(job.getKey() + " will run at: " + date + " and repeat: " + trigger.getRepeatCount() + " times, every "
                + trigger.getRepeatInterval() / 1000 + " seconds");

        // ====================================================================
        // ============ 啓動調度器
        // ====================================================================
        scheduler.start();

        // ====================================================================
        // ============ 在調度器啓動以後,新增長的job7仍將能夠被調度,job7將5分鐘執行一次,總共重複20次
        // ====================================================================
        job = newJob(SimpleJob.class).withIdentity("job7", "group1").build();
        trigger = newTrigger().withIdentity("trigger7", "group1").startAt(startTime)
                .withSchedule(simpleSchedule().withIntervalInMinutes(5).withRepeatCount(20)).build();
        date = scheduler.scheduleJob(job, trigger);
        LOG.info(job.getKey() + " will run at: " + date + " and repeat: " + trigger.getRepeatCount() + " times, every "
                + trigger.getRepeatInterval() / 1000 + " seconds");

        // ====================================================================
        // ============ job8綁定到group1,只有定義好觸發器,纔會被執行
        // ====================================================================
        job = newJob(SimpleJob.class).withIdentity("job8", "group1").storeDurably().build();
        scheduler.addJob(job, true); // job添加到任務調度器
        scheduler.triggerJob(jobKey("job8", "group1")); // 手動觸發job8,綁定到group1

        try {
            Thread.sleep(30L * 1000L); // 等待30秒,讓任務都執行完畢
        } catch (Exception e) {
        }

        /**
         * 終止調度。
         * 可是若是當前仍然有任務正在運行中,則會等待該任務執行完畢再終止,期間debug信息會打印:
         * 21:48:54.965 [main] DEBUG org.quartz.simpl.SimpleThreadPool - Waiting for thread TestScheduler_Worker-1 to shut down
         */
        scheduler.shutdown(true);

        // 顯示調度器的一些統計信息
        SchedulerMetaData metaData = scheduler.getMetaData();
        LOG.info("Executed " + metaData.getNumberOfJobsExecuted() + " jobs.");

    }

    // 演示觸發器被從新調度案例
    private void rescheduleJobDemo() throws SchedulerException {
        // 初始化一個調度工廠,並實例化一個調度類
        SchedulerFactory sf = new StdSchedulerFactory();
        Scheduler scheduler = sf.getScheduler();
        // 第一個參數:null就是默認當前時間,也能夠指定時間
        // 第二個參數:把一分鐘按30進行劃分,也就是60/30等份。
        // 舉例:當前時間是21:01:27,那麼startTime就是21:01:30。當前時間是21:01:32,那麼startTime就是21:02:00。
        Date startTime = DateBuilder.nextGivenSecondDate(null, 15);

        // ====================================================================
        // ============ job600 將被無限期地執行,每隔5秒執行一次,由trigger2019觸發
        // ====================================================================
        JobDetail job = newJob(SimpleJob.class).withIdentity("job600", "group1").build();
        SimpleTrigger trigger = newTrigger().withIdentity("trigger2019", "group1").startAt(startTime)
                .withSchedule(simpleSchedule().withIntervalInSeconds(5).repeatForever()).build();
        Date date = scheduler.scheduleJob(job, trigger);
        LOG.info(job.getKey() + " will run at: " + date + " and repeat: " + trigger.getRepeatCount() + " times, every "
                + trigger.getRepeatInterval() / 1000 + " seconds");
        // ====================================================================
        // ============ 啓動調度器
        // ====================================================================
        scheduler.start();

        try {
            System.out.println("線程進入睡眠");
            Thread.sleep(10000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("線程被喚醒");
        // ====================================================================
        // ============ job600 被從新定義的trigger2019觸發器從新調度,改成每1秒鐘執行一次
        // ====================================================================
        SimpleTrigger trigger2 = newTrigger().withIdentity("trigger2019", "group1").startAt(startTime)
                .withSchedule(simpleSchedule().withIntervalInSeconds(1).repeatForever()).build();
        Date date2 = scheduler.rescheduleJob(trigger2.getKey(), trigger2);
        LOG.info("job600 rescheduled to run at: " + date2);
    }

    public static void main(String[] args) throws Exception {
        SimpleTriggerExample example = new SimpleTriggerExample();
        example.run();
        example.rescheduleJobDemo(); // 從新調度案例
    }

}
相關文章
相關標籤/搜索