自定義Quartz超實用工具類

自定義Quartz超實用工具類

1.添加maven依賴

<!-- https://mvnrepository.com/artifact/org.quartz-scheduler/quartz -->
<dependency>
  <groupId>org.quartz-scheduler</groupId>
  <artifactId>quartz</artifactId>
  <version>${quartz.version}</version>
</dependency>

2.實現(xiàn)Quartz實用工具類

/**
 * Quartz任務調(diào)度器工具類
 *
 * @author CatalpaFlat
 * @date Create in 10:25 2017/11/16
 */
public class QuartzUtil {
    /**
     * 調(diào)度器工廠
     */
    private static SchedulerFactory schedulerFactory = new StdSchedulerFactory();
    /**
     * 默認Job組名
     */
    private static String JOB_GROUP_NAME = "DEFAULT_JOB_GROUP_NAME";
    /**
     * 默認觸發(fā)器組名
     */
    private static String TRIGGER_GROUP_NAME = "DEFAULT_TRIGGER_GROUP_NAME";

    /**
     * 獲取調(diào)度器
     *
     * @return Scheduler
     * @throws SchedulerException Scheduler獲取異常
     */
    private static Scheduler getScheduler() throws SchedulerException {
        return schedulerFactory.getScheduler();
    }

    /**
     * 獲取CronTrigger
     *
     * @param jobName          任務名
     * @param triggerGroupName 觸發(fā)器組名(為空使用默認)
     * @param time             crond格式時間
     * @return CronTrigger
     */
    private static CronTrigger getCronTrigger(String jobName, String triggerGroupName, String time) {
        if (StringUtils.isBlank(triggerGroupName)) {
            triggerGroupName = TRIGGER_GROUP_NAME;
        }
        return TriggerBuilder.newTrigger().withIdentity(jobName, triggerGroupName)
                .withSchedule(CronScheduleBuilder.cronSchedule(time)).build();
    }

    /**
     * 獲取JobDetail
     *
     * @param jobName      任務名
     * @param jobGroupName 任務組名(為空使用默認)
     * @param cls          任務類
     * @param jobDataMap   附帶參數(shù)
     * @return JobDetail
     */
    private static JobDetail getJobDetail(String jobName, String jobGroupName, Class<? extends Job> cls, JobDataMap jobDataMap) {
        if (StringUtils.isBlank(jobGroupName)) {
            jobGroupName = JOB_GROUP_NAME;
        }

        if (jobDataMap != null) {
            return JobBuilder.newJob(cls).withIdentity(jobName, jobGroupName).usingJobData(jobDataMap).build();
        } else {
            return JobBuilder.newJob(cls).withIdentity(jobName, jobGroupName).build();
        }
    }

    /**
     * 設置JobDetail 和 CronTrigger 到 scheduler(已獲取的調(diào)度器中驰坊,無需重復調(diào)用)
     *
     * @param cls              任務嘞
     * @param jobName          任務名
     * @param jobGroupName     任務組名(為空使用默認)
     * @param triggerGroupName 觸發(fā)器組名(為空使用默認)
     * @param time             crond格式時間
     * @param jobDataMap       附帶參數(shù)
     * @param scheduler        調(diào)度器
     * @return 設置成功與否
     * @throws SchedulerException 調(diào)度器異常
     */
    private static boolean setJobDetailAndCronTriggerInScheduler(Class<? extends Job> cls, String jobName, String jobGroupName, String triggerGroupName,
                                                                 String time, JobDataMap jobDataMap, Scheduler scheduler) throws SchedulerException {
        if (!isJobKey(scheduler, jobName, jobGroupName)) {
            return false;
        }
        JobDetail jobDetail = getJobDetail(jobName, jobGroupName, cls, jobDataMap);
        CronTrigger trigger = getCronTrigger(jobName, triggerGroupName, time);
        scheduler.scheduleJob(jobDetail, trigger);
        if (!scheduler.isShutdown()) {
            scheduler.start();
        }
        return true;
    }

    /**
     * 從調(diào)度器中移除Job
     *
     * @param scheduler  調(diào)度器
     * @param triggerKey 觸發(fā)器key(名翘鸭,組)
     * @param jobKey     任務key(名窒典,組)
     */
    private static void removeJob(Scheduler scheduler, TriggerKey triggerKey, JobKey jobKey) {
        try {
            // 停止觸發(fā)器
            scheduler.pauseTrigger(triggerKey);
            //移除觸發(fā)器
            scheduler.unscheduleJob(triggerKey);
            // 刪除任務
            scheduler.deleteJob(jobKey);
        } catch (SchedulerException e) {
            e.printStackTrace();
        }
    }

    /**
     * 使用CronTrigger類型添加任務
     *
     * @param scheduler        調(diào)度器
     * @param cls              任務嘞
     * @param jobName          任務名
     * @param jobGroupName     任務組名(為空使用默認)
     * @param triggerGroupName 觸發(fā)器組名(為空使用默認)
     * @param time             crond格式時間
     * @param jobDataMap       附帶參數(shù)
     * @return 是否添加成功
     */
    private static boolean addJobByCronTrigger(Scheduler scheduler, Class<? extends Job> cls, String jobName, String jobGroupName,
                                               String triggerGroupName, String time, JobDataMap jobDataMap) {
        try {
            return setJobDetailAndCronTriggerInScheduler(cls, jobName, jobGroupName, triggerGroupName, time, jobDataMap, scheduler);
        } catch (SchedulerException e) {
            e.printStackTrace();
            return false;
        }
    }

    /**
     * 判斷是否存在JobKey
     *
     * @param scheduler    任務調(diào)度器
     * @param jobName      任務名
     * @param jobGroupName 任務組名
     * @return 是否存在JobKey
     */
    private static boolean isJobKey(Scheduler scheduler, String jobName, String jobGroupName) {
        JobKey jobKey = JobKey.jobKey(jobName, jobGroupName);
        try {
            JobDetail jobDetail = scheduler.getJobDetail(jobKey);
            return jobDetail == null;
        } catch (SchedulerException e) {
            e.printStackTrace();
            return false;
        }
    }

    /**
     * 添加定時任務
     *
     * @param cls              任務類
     * @param jobName          任務名
     * @param jobGroupName     任務組名(為空使用默認)
     * @param triggerGroupName 觸發(fā)器組名(為空使用默認)
     * @param time             crond格式時間
     * @param jobDataMap       附帶參數(shù)
     * @return 是否正常添加任務
     */
    public static boolean addJobByCronTrigger(Class<? extends Job> cls, String jobName, String jobGroupName,
                                              String triggerGroupName, String time, JobDataMap jobDataMap) {
        try {
            if (StringUtils.isBlank(jobName)) {
                return false;
            }
            Scheduler scheduler = getScheduler();
            return setJobDetailAndCronTriggerInScheduler(cls, jobName, jobGroupName, triggerGroupName, time, jobDataMap, scheduler);
        } catch (SchedulerException e) {
            e.printStackTrace();
            return false;
        }
    }

    /**
     * 修改任務時間
     *
     * @param jobName          任務名
     * @param time             crond格式時間
     * @param jobGroupName     任務組名(為空使用默認)
     * @param triggerGroupName 觸發(fā)器組名(為空使用默認)
     * @param jobDataMap       附帶參數(shù)
     * @return 是否修改成功
     */
    public static boolean modifyJobTime(String jobName, String time, String jobGroupName,
                                        String triggerGroupName, JobDataMap jobDataMap) {
        try {
            if (StringUtils.isBlank(jobName)) {
                return false;
            }
            Scheduler scheduler = getScheduler();
            if (StringUtils.isBlank(triggerGroupName)) {
                triggerGroupName = TRIGGER_GROUP_NAME;
            }
            TriggerKey triggerKey = TriggerKey.triggerKey(jobName, triggerGroupName);
            CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey);
            if (trigger == null) {
                return false;
            }
            String oldTime = trigger.getCronExpression();
            if (!oldTime.equalsIgnoreCase(time)) {
                if (StringUtils.isBlank(jobGroupName)) {
                    jobGroupName = JOB_GROUP_NAME;
                }
                JobKey jobKey = JobKey.jobKey(jobName, jobGroupName);
                JobDetail jobDetail = scheduler.getJobDetail(jobKey);
                Class<? extends Job> jobClass = jobDetail.getJobClass();
                removeJob(scheduler, triggerKey, jobKey);
                return addJobByCronTrigger(scheduler, jobClass, jobName, jobGroupName, triggerGroupName, time, jobDataMap);
            }
            return true;
        } catch (SchedulerException e) {
            e.printStackTrace();
            return false;
        }
    }

    /**
     * 啟動所有定時任務
     */
    public static void startJobs() {
        try {
            Scheduler scheduler = getScheduler();
            scheduler.start();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * 關閉所有定時任務
     */
    public static void shutdownJobs() {
        try {
            Scheduler scheduler = getScheduler();
            if (!scheduler.isShutdown()) {
                scheduler.shutdown();
            }
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * 停止一個job任務
     *
     * @param jobName      任務名
     * @param jobGroupName 任務組名(空位默認)
     * @return 是否停止
     */
    public static boolean pauseJob(String jobName, String jobGroupName) {
        try {
            Scheduler scheduler = getScheduler();
            if (StringUtils.isBlank(jobGroupName)) {
                jobGroupName = JOB_GROUP_NAME;
            }
            scheduler.interrupt(JobKey.jobKey(jobName, jobGroupName));
            return true;
        } catch (SchedulerException e) {
            e.printStackTrace();
            return false;
        }
    }

    /**
     * 恢復一個job任務
     *
     * @param jobName      任務名
     * @param jobGroupName 任務組名(空位默認)
     * @return 是否恢復
     */
    public static boolean resumeJob(String jobName, String jobGroupName) {
        try {
            Scheduler scheduler = getScheduler();
            scheduler.resumeJob(JobKey.jobKey(jobName, jobGroupName));
            return true;
        } catch (SchedulerException e) {
            e.printStackTrace();
            return false;
        }
    }

    /**
     * 添加定時任務
     *
     * @param cls  任務類
     * @param bJob 任務類屬性
     * @return 是否添加成功
     */
    public static boolean addJobByCronTrigger(Class<? extends Job> cls, BaseJob bJob) {
        if (bJob == null) {
            return false;
        }
        String jobName = bJob.getJobName();
        if (StringUtils.isBlank(jobName)) {
            return false;
        }
        try {
            Scheduler scheduler = getScheduler();
            return setJobDetailAndCronTriggerInScheduler(cls, jobName, bJob.getJobGroupName(), bJob.getTriggerGroupName(), bJob.getCronTime(), bJob.getJobDataMap(), scheduler);
        } catch (SchedulerException e) {
            e.printStackTrace();
            return false;
        }
    }

    /**
     * 修改任務JobDateMap
     *
     * @param cls  任務類
     * @param bJob 任務類屬性
     * @return 是否修改成功
     */
    public static boolean modifyJobDateMap(Class<? extends Job> cls, BaseJob bJob) {
        if (bJob == null) {
            return false;
        }
        String jobName = bJob.getJobName();
        if (StringUtils.isBlank(jobName)) {
            return false;
        }
        String triggerGroupName = bJob.getTriggerGroupName();
        if (StringUtils.isBlank(triggerGroupName)) {
            triggerGroupName = TRIGGER_GROUP_NAME;
        }
        TriggerKey triggerKey = TriggerKey.triggerKey(jobName, triggerGroupName);
        String jobGroupName = bJob.getJobGroupName();
        if (StringUtils.isBlank(jobGroupName)) {
            jobGroupName = JOB_GROUP_NAME;
        }
        try {
            Scheduler scheduler = getScheduler();
            JobKey jobKey = JobKey.jobKey(jobName, jobGroupName);
            JobDetail jobDetail1 = scheduler.getJobDetail(jobKey);
            if (jobDetail1 == null) {
                return false;
            }
            JobDataMap oldJobDataMap = jobDetail1.getJobDataMap();
            JobDataMap jobDataMap = bJob.getJobDataMap();
            if (!oldJobDataMap.equals(jobDataMap)) {
                Class<? extends Job> jobClass = jobDetail1.getJobClass();
                removeJob(scheduler, triggerKey, jobKey);
                return addJobByCronTrigger(scheduler, jobClass, jobName, jobGroupName, triggerGroupName, bJob.getCronTime(), jobDataMap);
            }
            return true;
        } catch (SchedulerException e) {
            e.printStackTrace();
            return false;
        }
    }
}
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市堆缘,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖邑雅,帶你破解...
    沈念sama閱讀 221,695評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異患雇,居然都是意外死亡跃脊,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評論 3 399
  • 文/潘曉璐 我一進店門苛吱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來酪术,“玉大人,你說我怎么就攤上這事翠储』嫜悖” “怎么了?”我有些...
    開封第一講書人閱讀 168,130評論 0 360
  • 文/不壞的土叔 我叫張陵援所,是天一觀的道長庐舟。 經(jīng)常有香客問我,道長住拭,這世上最難降的妖魔是什么挪略? 我笑而不...
    開封第一講書人閱讀 59,648評論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮废酷,結果婚禮上瘟檩,老公的妹妹穿的比我還像新娘。我一直安慰自己澈蟆,他們只是感情好墨辛,可當我...
    茶點故事閱讀 68,655評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著趴俘,像睡著了一般睹簇。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上寥闪,一...
    開封第一講書人閱讀 52,268評論 1 309
  • 那天太惠,我揣著相機與錄音,去河邊找鬼疲憋。 笑死凿渊,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的缚柳。 我是一名探鬼主播埃脏,決...
    沈念sama閱讀 40,835評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼秋忙!你這毒婦竟也來了彩掐?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,740評論 0 276
  • 序言:老撾萬榮一對情侶失蹤灰追,失蹤者是張志新(化名)和其女友劉穎堵幽,沒想到半個月后狗超,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,286評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡朴下,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,375評論 3 340
  • 正文 我和宋清朗相戀三年努咐,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片桐猬。...
    茶點故事閱讀 40,505評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡麦撵,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出溃肪,到底是詐尸還是另有隱情免胃,我是刑警寧澤,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布惫撰,位于F島的核電站羔沙,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏厨钻。R本人自食惡果不足惜扼雏,卻給世界環(huán)境...
    茶點故事閱讀 41,873評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望夯膀。 院中可真熱鬧诗充,春花似錦、人聲如沸诱建。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,357評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽俺猿。三九已至茎匠,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間押袍,已是汗流浹背诵冒。 一陣腳步聲響...
    開封第一講書人閱讀 33,466評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留谊惭,地道東北人汽馋。 一個月前我還...
    沈念sama閱讀 48,921評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像圈盔,于是被迫代替她去往敵國和親豹芯。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,515評論 2 359

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理药磺,服務發(fā)現(xiàn),斷路器煤伟,智...
    卡卡羅2017閱讀 134,701評論 18 139
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,288評論 25 707
  • Spring Boot 參考指南 介紹 轉載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,855評論 6 342
  • 我的人生可以有把玩單調(diào)的時間 ,但沒有忍受厭倦的余地——村上春樹#《海邊的卡夫卡》 邀約問去不去額濟納围辙,就只猶豫了...
    和風與細雨閱讀 284評論 0 0
  • 現(xiàn)在中印洞朗地區(qū)的戰(zhàn)爭我碟,看來是難以避免了。至于怎么打姚建、打到什么程度矫俺,我們估測不了。那么我們試著分析一下這件事情背后...
    一葉茶閱讀 549評論 0 1