quartz2.3.0(七)調度器中斷任務執行,手動處理任務中斷事件

job任務類java

package org.quartz.examples.example7;

import java.util.Date;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.quartz.InterruptableJob;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.JobKey;
import org.quartz.UnableToInterruptJobException;

/**
 * 一個可中斷做業的愚蠢實現,用於單元測試。
 */
public class DumbInterruptableJob implements InterruptableJob {

    private static Logger LOG = LoggerFactory.getLogger(DumbInterruptableJob.class);

    // 任務是否被打斷標記
    private boolean _interrupted = false;

    // job name
    private JobKey _jobKey = null;

    // 必需要有public修飾的無參構造函數
    public DumbInterruptableJob() {
    }

    // 定時器執行方法
    public void execute(JobExecutionContext context) throws JobExecutionException {

        _jobKey = context.getJobDetail().getKey();
        LOG.info("---- " + _jobKey + " executing at " + new Date() + ", _interrupted = " + _interrupted);

        try {
            // main job loop... see the JavaDOC for InterruptableJob for discussion...
            // do some work... in this example we are 'simulating' work by sleeping... :)

            for (int i = 0; i < 4; i++) {
                try {
                    Thread.sleep(1000L);
                } catch (Exception ignore) {
                    ignore.printStackTrace();
                }
                LOG.info("---- job任務for循環["+i+"], _interrupted = " + _interrupted);
                // 按期檢查咱們是否被中斷了,在這裏能夠手動處理咱們的業務邏輯
                if (_interrupted) {
                    LOG.info("--- " + _jobKey + "  -- 打斷……救助!!!");
                    return; // 若是拋出JobExecutionException是基於特定工做的職責/行爲的,那麼還能夠選擇拋出它嗎
                }
            }

        } finally {
            LOG.info("---- " + _jobKey + " completed at " + new Date());
        }
    }

    //重寫任務的被中斷方法,手動處理中斷事件
    @Override
    public void interrupt() throws UnableToInterruptJobException {
        LOG.info("---" + _jobKey + "  -- INTERRUPTING --");
        _interrupted = true;
    }

}

 

調度器類ide

package org.quartz.examples.example7;

import static org.quartz.DateBuilder.nextGivenSecondDate;
import static org.quartz.JobBuilder.newJob;
import static org.quartz.SimpleScheduleBuilder.simpleSchedule;
import static org.quartz.TriggerBuilder.newTrigger;

import org.quartz.JobDetail;
import org.quartz.Scheduler;
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 InterruptExample {

    public void run() throws Exception {
        final Logger log = LoggerFactory.getLogger(InterruptExample.class);

        log.info("------- Initializing ----------------------");

        // First we must get a reference to a scheduler
        SchedulerFactory sf = new StdSchedulerFactory();
        Scheduler sched = sf.getScheduler();

        // 第一個參數:null就是默認當前時間,也能夠指定時間
        // 第二個參數:把一分鐘按30進行劃分,也就是60/30等份。
        // 舉例:當前時間是21:01:27,那麼startTime就是21:01:30。當前時間是21:01:32,那麼startTime就是21:02:00。
        Date startTime = nextGivenSecondDate(null, 15);
        JobDetail job = newJob(DumbInterruptableJob.class).withIdentity("interruptableJob1", "group1").build();

        // 間隔5秒,無限循環
        SimpleTrigger trigger = newTrigger().withIdentity("trigger1", "group1").startAt(startTime)
                .withSchedule(simpleSchedule().withIntervalInSeconds(5).repeatForever()).build();
        Date ft = sched.scheduleJob(job, trigger);
        log.info(job.getKey() + " will run at: " + ft + " and repeat: " + trigger.getRepeatCount() + " times, every "
                + trigger.getRepeatInterval() / 1000 + " seconds");

        sched.start();

        log.info("------- 每7秒就中斷一次job任務,循環50次 ----------");
        for (int i = 0; i < 50; i++) {
            Thread.sleep(7000L);
            log.info("------- 每7秒就中斷一次job任務,循環:" + i);
            sched.interrupt(job.getKey()); //調度器能夠直接中斷某個任務
        }

        log.info("------- Shutting Down ---------------------");
        sched.shutdown(true);

        log.info("------- Shutdown Complete -----------------");
        SchedulerMetaData metaData = sched.getMetaData();
        log.info("Executed " + metaData.getNumberOfJobsExecuted() + " jobs.");

    }

    public static void main(String[] args) throws Exception {

        InterruptExample example = new InterruptExample();
        example.run();
    }

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