欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Quartz定時任務管理方式(動態(tài)添加、停止、恢復、刪除定時任務)

 更新時間:2023年12月14日 09:25:54   作者:古甲哈醒  
這篇文章主要介紹了Quartz定時任務管理方式(動態(tài)添加、停止、恢復、刪除定時任務),具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教

Quartz定時任務框架經(jīng)常用于系統(tǒng)后臺業(yè)務異步處理。平常我們使用時,主要是通過手工編寫配置代碼文件方式添加修改定時任務,然后重啟系統(tǒng)。

有時候我們需要根據(jù)業(yè)務運營需要,動態(tài)添加修改定時任務,比如添加新的定時任務、修改任務執(zhí)行時間、暫停定時任務、刪除定時任務等,并且監(jiān)控定時任務狀態(tài),而又不想重啟系統(tǒng),這時就需要系統(tǒng)具備動態(tài)管理定時任務的功能。

Quartz提供了一系列組件,支持動態(tài)管理定時任務的功能。

Quartz定時任務主要由Scheduler、JobDetail、CronTrigger、Cron組成,實現(xiàn)動態(tài)管理定時任務,主要就是通過管理上述對象來實現(xiàn)的。 

1、數(shù)據(jù)庫設計

主要將我們平時配置的任務計劃放入數(shù)據(jù)庫中保存。在啟動任務是,從數(shù)據(jù)庫中查找任務計劃信息,并動態(tài)配置進去即可。

DROP TABLE IF EXISTS `cc_task_info`;
CREATE TABLE `cc_task_info` (
  `TID` int(11) NOT NULL AUTO_INCREMENT,
  `TASK_ANME` varchar(50) NOT NULL,
  `TASK_CODE` varchar(50) NOT NULL,
  `JOB_CLASS` varchar(200) NOT NULL,
  `JOB_GROUP` varchar(50) NOT NULL,
  `CRON` varchar(50) NOT NULL,
  `DEL_STATUS` varchar(2) DEFAULT '1' NULL,
  `CRT_TIME` datetime DEFAULT NULL,
  PRIMARY KEY (`TID`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='定時任務管理表';

DROP TABLE IF EXISTS `cc_task_record`;
CREATE TABLE `cc_task_record` (
  `RID` int(11) NOT NULL AUTO_INCREMENT,
  `TASK_CODE` varchar(50) NOT NULL,
  `RUN_TIME` datetime NOT NULL,
  `RUN_CODE` char(1) NOT NULL,
  `RUN_MSG` varchar(100) NULL,
  PRIMARY KEY (`RID`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='定時任務運行記錄表';

DROP TABLE IF EXISTS `cc_task_status`;
CREATE TABLE `cc_task_status` (
  `TASK_CODE` varchar(50) NOT NULL,
  `TASK_STATUS` varchar(10) NOT NULL,
  `LST_SUCC_TIME` datetime NOT NULL,
  `LST_TIME` datetime NOT NULL,
  PRIMARY KEY (`TASK_CODE`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='定時任務運行狀態(tài)表';

2、定時任務管理

定時任務管理主要是通過Scheduler的方法來實現(xiàn)。Scheduler提供了一系列方法來管理定時任務的執(zhí)行狀態(tài)。

主要包括:

  • scheduleJob():添加定時任務
  • rescheduleJob():修改定時任務
  • pauseJob():暫停定時任務執(zhí)行
  • resumeJob():恢復定時任務執(zhí)行
  • deleteJob():刪除定時任務執(zhí)行

針對上述方法,我們只需要傳入對應參數(shù)即可。

這里我建了一個QuartzService來管理定時任務,供業(yè)務層調(diào)用。

詳細代碼如下:

/**
 * 定時任務管理服務
 */
@Service
public class QuartzService {

    public static String SCHEDULER_OPR_START = "start";
    public static String SCHEDULER_OPR_PAUSE = "pause";
    public static String SCHEDULER_OPR_RESUME = "resume";
    public static String SCHEDULER_OPR_REMOVE = "remove";

    @Autowired
    private Scheduler scheduler;

    /**
     * 啟動任務
     */
    public void startJob(String taskCode, String taskAnme, String cron, String jobGroup,
                         String className) throws Exception{
        Class<Job> jobClass = null;
        try {
            jobClass = (Class<Job>) Class.forName(className);//獲取任務執(zhí)行類
        } catch (ClassNotFoundException e) {
            throw new Exception("任務類不存在");
        }
        //創(chuàng)建job,指定job名稱和分組
        JobDetail jobDetail = JobBuilder.newJob(jobClass).withIdentity(taskCode, jobGroup).build();
        //創(chuàng)建表達式工作計劃
        CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(cron);
        //創(chuàng)建觸發(fā)器
        CronTrigger cronTrigger = TriggerBuilder.newTrigger().withIdentity(taskCode, jobGroup)
                .withSchedule(cronScheduleBuilder).build();
        scheduler.scheduleJob(jobDetail, cronTrigger);
    }

    /**
     * 修改定時任務執(zhí)行時間
     * @param taskCode
     * @param jobGroup
     * @param cron 新的時間
     * @throws Exception
     */
    public void modifyJob(String taskCode, String jobGroup, String cron) throws Exception{
        TriggerKey triggerKey = new TriggerKey(taskCode, jobGroup);
        CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey);
        String oldCron = trigger.getCronExpression();
        if(!oldCron.equals(cron)){
            CronTrigger cronTrigger = TriggerBuilder.newTrigger().withIdentity(taskCode, jobGroup)
                    .withSchedule(CronScheduleBuilder.cronSchedule(cron)).build();
            Date date = scheduler.rescheduleJob(triggerKey, cronTrigger);
            if(date == null){
                throw new Exception("修改定時任務執(zhí)行時間報錯");
            }
        }
    }

    /**
     * 暫停某個定時任務(任務恢復后,暫停時間段內(nèi)未執(zhí)行的任務會繼續(xù)執(zhí)行,如暫停時間段內(nèi)有2次,則會執(zhí)行2次)
     * @param taskCode
     * @param jobGroup
     * @throws Exception
     */
    public void pauseJob(String taskCode, String jobGroup) throws Exception{
        JobKey jobKey = new JobKey(taskCode, jobGroup);
        JobDetail jobDetail = scheduler.getJobDetail(jobKey);
        if(jobDetail == null){
            return;
        }
        scheduler.pauseJob(jobKey);
    }

    /**
     * 恢復某個定時任務
     * @param taskCode
     * @param jobGroup
     * @throws Exception
     */
    public void resumeJob(String taskCode, String jobGroup) throws Exception{
        JobKey jobKey = new JobKey(taskCode, jobGroup);
        JobDetail jobDetail = scheduler.getJobDetail(jobKey);
        if(jobDetail == null){
            return;
        }
        scheduler.resumeJob(jobKey);
    }

    /**
     * 刪除某個定時任務
     * @param taskCode
     * @param jobGroup
     * @throws Exception
     */
    public void deleteJob(String taskCode, String jobGroup) throws Exception{
        JobKey jobKey = new JobKey(taskCode, jobGroup);
        JobDetail jobDetail = scheduler.getJobDetail(jobKey);
        if(jobDetail == null){
            return;
        }
        scheduler.deleteJob(jobKey);
    }
}

3、編寫任務類JOB

任務類JOB就是定時任務具體要處理的系統(tǒng)業(yè)務邏輯,需要實現(xiàn)Job接口。

在任務啟動時,通過jobClass傳入JobDetail。

public class DemoJob implements Job {

    @Override
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        String taskCode = jobExecutionContext.getJobDetail().getKey().getName();
        System.out.println("執(zhí)行定時任務:" + taskCode);
    }
}

4、配置Scheduler

在Configuration中配置Scheduler實例,并啟動。

@Configuration
public class QuartzConfig {

    @Bean
    public Scheduler scheduler(){
        Scheduler scheduler = null;
        SchedulerFactory factory = new StdSchedulerFactory();
        try {
            scheduler = factory.getScheduler();
        } catch (SchedulerException e) {
            e.printStackTrace();
        }
        if(scheduler != null){
            try {
                //啟動定時任務
                scheduler.start();
            } catch (SchedulerException e) {
                e.printStackTrace();
            }
        }
        return scheduler;
    }
}

5、編寫API接口

通過Controller提供API接口,這里我的TaskService調(diào)用了QartzService的對應接口,并做了一個寫數(shù)據(jù)庫讀寫操作,主要記錄定時任務狀態(tài)、執(zhí)行記錄信息的等。

@RestController
@RequestMapping("/api/task")
public class TaskController {

    @Autowired
    private TaskService service;

    @RequestMapping("/start")
    public Object start(int id){
        try {
            service.startJob(id);
            return RtnData.ok();
        } catch (Exception e) {
            return RtnData.fail(e.getMessage());
        }
    }

    @RequestMapping("/pause")
    public Object pause(int id){
        try {
            service.pauseJob(id);
            return RtnData.ok();
        } catch (Exception e) {
            return RtnData.fail(e.getMessage());
        }
    }

    @RequestMapping("/resume")
    public Object resume(int id){
        try {
            service.resumeJob(id);
            return RtnData.ok();
        } catch (Exception e) {
            return RtnData.fail(e.getMessage());
        }
    }

    @RequestMapping("/remove")
    public Object remove(int id){
        try {
            service.deleteJob(id);
            return RtnData.ok();
        } catch (Exception e) {
            return RtnData.fail(e.getMessage());
        }
    }
}

6、接口測試

先在數(shù)據(jù)庫中將DemoJob添加到任務管理表中,然后使用postman調(diào)用api進行任務啟動、修改、暫停、恢復、刪除等操作,觀察系統(tǒng)后臺日志打印情況查看效果。

數(shù)據(jù)庫初始化如下:

總結

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • 一篇文章帶你入門java方法

    一篇文章帶你入門java方法

    這篇文章主要介紹了java基礎之方法詳解,文中有非常詳細的代碼示例,對正在學習java基礎的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-08-08
  • Java Swing JPanel面板的使用方法

    Java Swing JPanel面板的使用方法

    這篇文章主要介紹了Java Swing JPanel面板的使用方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-12-12
  • SpringBoot中的文件上傳與下載詳解

    SpringBoot中的文件上傳與下載詳解

    這篇文章主要介紹了SpringBoot中的文件上傳與下載詳解,springboot是spring家族中的一個全新框架,用來簡化spring程序的創(chuàng)建和開發(fā)過程,本文我們就一起來看看上傳與下載的操作,需要的朋友可以參考下
    2023-08-08
  • 基于JTable的列寬與內(nèi)容自適應的實現(xiàn)方法

    基于JTable的列寬與內(nèi)容自適應的實現(xiàn)方法

    本篇文章是對JTable的列寬與內(nèi)容自適應的實現(xiàn)方法進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05
  • mybatis數(shù)組和集合的長度判斷及插入方式

    mybatis數(shù)組和集合的長度判斷及插入方式

    這篇文章主要介紹了mybatis數(shù)組和集合的長度判斷及插入方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • 詳解Spring Boot 2.0.2+Ajax解決跨域請求的問題

    詳解Spring Boot 2.0.2+Ajax解決跨域請求的問題

    這篇文章主要介紹了詳解Spring Boot 2.0.2+Ajax解決跨域請求的問題,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-03-03
  • 基于SpringBoot實現(xiàn)大文件分塊上傳功能

    基于SpringBoot實現(xiàn)大文件分塊上傳功能

    這篇文章主要介紹了基于SpringBoot實現(xiàn)大文件分塊上傳功能,實現(xiàn)原理其實很簡單,核心就是客戶端把大文件按照一定規(guī)則進行拆分,比如20MB為一個小塊,分解成一個一個的文件塊,然后把這些文件塊單獨上傳到服務端,需要的朋友可以參考下
    2024-09-09
  • Maven配置文件pom.xml詳解

    Maven配置文件pom.xml詳解

    什么是POM?這篇文章主要介紹了Maven的配置文件pom.xml,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • Java 完美判斷中文字符的方法

    Java 完美判斷中文字符的方法

    Java判斷一個字符串是否有中文一般情況是利用Unicode編碼正則來做判斷,但是其實這個區(qū)間來判斷中文不是非常精確,以下是比較完善的判斷方法
    2013-02-02
  • 用Java程序判斷是否是閏年的簡單實例

    用Java程序判斷是否是閏年的簡單實例

    下面小編就為大家?guī)硪黄肑ava程序判斷是否是閏年的實現(xiàn)方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-06-06

最新評論