quartz2.3.0(六)job任務異常處理方式

Job1類java

package org.quartz.examples.example6;

import org.quartz.DisallowConcurrentExecution;
import org.quartz.Job;
import org.quartz.JobDataMap;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.JobKey;
import org.quartz.PersistJobDataAfterExecution;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.Date;

/**
 * <p>
 * 一個會引起做業執行異常的做業
 * </p>
 */
@PersistJobDataAfterExecution // 持久化JobDataMap裏的數據,使下一個定時任務還能獲取到這些值
@DisallowConcurrentExecution // 禁止併發多任務執行,因此永遠只有一個任務在執行中
public class BadJob1 implements Job {

    // Logging
    private static Logger LOG = LoggerFactory.getLogger(BadJob1.class);
    private int calculation;

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

    //定時器執行方法
    public void execute(JobExecutionContext context) throws JobExecutionException {
        JobKey jobKey = context.getJobDetail().getKey();
        JobDataMap dataMap = context.getJobDetail().getJobDataMap();

        int denominator = dataMap.getInt("denominator");
        LOG.info("---" + jobKey + " executing at " + new Date() + " with denominator " + denominator);

        // 一我的爲設計的異常示例,該異常將由該做業生成,緣由是除0錯誤(僅在第一次運行時)
        try {
            calculation = 4815 / denominator;
        } catch (Exception e) {
            LOG.info("--- Error in job!");
            JobExecutionException e2 = new JobExecutionException(e);

            // 修正分母,以便下次做業運行時不會再次失敗
            dataMap.put("denominator", "1");

            // 是否當即從新觸發任務?true
            e2.setRefireImmediately(true);
            throw e2;
        }

        LOG.info("---" + jobKey + " completed at " + new Date());
    }

}

 

Job2類併發

package org.quartz.examples.example6;

import java.util.Date;

import org.quartz.DisallowConcurrentExecution;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.JobKey;
import org.quartz.PersistJobDataAfterExecution;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * <p>
 * 一個會引起做業執行異常的做業
 * </p>
 */
@PersistJobDataAfterExecution // 持久化JobDataMap裏的數據,使下一個定時任務還能獲取到這些值
@DisallowConcurrentExecution // 禁止併發多任務執行,因此永遠只有一個任務在執行中
public class BadJob2 implements Job {

    // Logging
    private static Logger LOG = LoggerFactory.getLogger(BadJob2.class);
    private int calculation;

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

    // 定時器執行方法
    public void execute(JobExecutionContext context) throws JobExecutionException {
        JobKey jobKey = context.getJobDetail().getKey();
        LOG.info("---" + jobKey + " executing at " + new Date());

        // 一我的爲設計的異常示例,該異常將由該做業因爲除零錯誤而生成
        try {
            int zero = 0;
            calculation = 4815 / zero;
        } catch (Exception e) {
            LOG.info("--- Error in job!");
            JobExecutionException e2 = new JobExecutionException(e);
            // Quartz將自動取消與此做業關聯的全部觸發器的調度,這樣它就不會再次運行
            e2.setUnscheduleAllTriggers(true);
            throw e2;
        }

        LOG.info("---" + jobKey + " completed at " + new Date());
    }

}

 

任務調度類函數

 

package org.quartz.examples.example6;

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;

/**
 * 這個做業演示了Quartz如何處理做業拋出的JobExecutionExceptions
 */
public class JobExceptionExample {
    Logger LOG = LoggerFactory.getLogger(JobExceptionExample.class);

    public void run() throws Exception {
        // 初始化一個調度工廠,並實例化一個調度類
        SchedulerFactory sf = new StdSchedulerFactory();
        Scheduler sched = sf.getScheduler();

        // 第一個參數:null就是默認當前時間,也能夠指定時間
        // 第二個參數:把一分鐘按15進行劃分,也就是60/15等份。
        // 舉例:當前時間是21:01:27,那麼startTime就是21:15:00。當前時間是21:35:32,那麼startTime就是21:45:00。
        Date startTime = nextGivenSecondDate(null, 15);

        // ========================================================
        // ============ badJob1將每10秒運行一次,此做業將拋出異常並當即從新啓動。
        // ========================================================
        JobDetail job = newJob(BadJob1.class).withIdentity("badJob1", "group1").usingJobData("denominator", "0")
                .build();
        // 觸發器每間隔10秒執行一次,無限循環
        SimpleTrigger trigger = newTrigger().withIdentity("trigger1", "group1").startAt(startTime)
                .withSchedule(simpleSchedule().withIntervalInSeconds(10).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");

        // ========================================================
        // ============ badJob2將每5秒運行一次,此做業將拋出異常,在異常catch塊裏取消了使用該任務觸發器的全部任務的觸發,而且永不從新啓動。
        // ========================================================
        JobDetail job2 = newJob(BadJob2.class).withIdentity("badJob2", "group1").build();
        // 觸發器每間隔5秒執行一次,無限循環
        SimpleTrigger trigger2 = newTrigger().withIdentity("trigger2", "group1").startAt(startTime)
                .withSchedule(simpleSchedule().withIntervalInSeconds(5).repeatForever()).build();
        Date ft2 = sched.scheduleJob(job2, trigger2);
        LOG.info(job2.getKey() + " will run at: " + ft2 + " and repeat: " + trigger2.getRepeatCount() + " times, every "
                + trigger2.getRepeatInterval() / 1000 + " seconds");

        sched.start();
        Thread.sleep(30L * 1000L);
        sched.shutdown(false);
        LOG.info("------- Shutdown Complete -----------------");

        SchedulerMetaData metaData = sched.getMetaData();
        LOG.info("Executed " + metaData.getNumberOfJobsExecuted() + " jobs.");
    }

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

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

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