第二十章、Spring Boot2.0 Quartz2

课时八十五、 Spring Boot 2.0 quartz:任务动态管理-添加

在前面我们讲到了任务的持久化了,但是在实际项目中,我们的PD还是会提出更高的需求

一、需求分析

那么任务动态管理都包括哪些呢?

(1)动态添加任务:在应用程序运行的过程中,动态的添加一个定时任务(无需重启应用)

(2)动态删除任务:在应用程序运行的过程中,动态的删除一个定时任务

(3)动态修改任务:在应用程序运行的过程中,动态的修改一个定时任务,这里的修改主要是修改定时任务的时间

(4)动态关闭所有任务:在应用程序运行的过程中,动态的关闭所有定时任务,也就是当前正在运行的定时任务统统停掉

(5)动态启动所有任务:在应用程序运行的过程中,动态的启动所有定时任务,也就是把所有暂停的定时任务都启动起来

二、编码思路

(1)触发器如何构建:使用TriggerBuilder就可以构建触发器

(2)任务如何定义:使用JobBuilder就可以定义job

(3)定时任务谁管理:这是由定时任务调度器Scheduler进行管理的

(4)定时任务调度器谁管理:由于这里我们使用了Spring集成了Quartz,所以这里的Scheduler是由SchedulerFactoryBean进行管理的

三、代码实现

    /**
     * 动态添加任务.
     * @param jobName : 任务的名称;
     * @param jobGroupName 任务的组名称;
     * @param triggerName : 触发器名称
     * @param triggerGroupName : 触发器组名称
     * @param jobClass : job实现类.
     * @param cronExpression : 定时任务表达式
     * @return date -- 此定时任务第一次触发的时间.
     */

    public Date addJob(String jobName,String jobGroupName,String triggerName,String triggerGroupName,Class jobClass,String cronExpression) {
        /*
         * 1/ 需要获取到任务调度器Scheduler
         * 2/定义jobDetail;
         * 3/定义trigger;
         * 4/使用Scheduler添加任务;
         */
        
        //* 1/ 需要获取到任务调度器Scheduler
        Scheduler scheduler = schedulerFactoryBean.getScheduler();
        
//         * 2/定义jobDetail;
        JobDetail jobDetail = JobBuilder.newJob(jobClass).withIdentity(jobName, jobGroupName).build();
        
//         * 3/定义trigger;
        Trigger trigger = TriggerBuilder.newTrigger().withIdentity(triggerName, triggerGroupName).withSchedule(CronScheduleBuilder.cronSchedule(cronExpression)).build();        
//         * 4/使用Scheduler添加任务;
        try {
            return scheduler.scheduleJob(jobDetail, trigger);
        } catch (SchedulerException e) {
            e.printStackTrace();
            return null;
        }
    }

课时八十六、Spring Boot 2.0 quartz:任务动态管理-删除

在前面一节介绍了动态任务的添加,这节讲讲动态任务的删除。

编码思路

1、获取到任务调度器

2、停止并且移除触发器

3、删除任务

代码片段

1、停止触发器

TriggerKey triggerKey = TriggerKey.triggerKey(triggerName, triggerGroupName);
scheduled.pauseTrigger(triggerKey);

2、移除触发器

scheduled.unscheduleJob(triggerKey);

3、删除任务

JobKey jobKey = JobKey.jobKey(jobName, jobGroupName);

代码实现

    /**
     * 定时任务删除
     * @param jobName
     * @param jobGroupName
     * @param triggerName
     * @param triggerGroupName
     */
    public void deleteJob(String jobName,String jobGroupName,String triggerName,String triggerGroupName) {
        /*
         1/ 获取到定时任务调度器.
         2/ 停止触发器.
         3/删除触发器.
         4/删除任务.
         */
        // 1/ 获取到定时任务调度器.
        Scheduler scheduler = schedulerFactoryBean.getScheduler();
        
        try {
            // 2/ 停止触发器.
            TriggerKey triggerKey  = TriggerKey.triggerKey(triggerName, triggerGroupName);
            scheduler.pauseTrigger(triggerKey);
            
            // 3/删除触发器.
            scheduler.unscheduleJob(triggerKey);
            
            // 4/删除任务.
            JobKey jobKey = JobKey.jobKey(jobName,jobGroupName);
            scheduler.deleteJob(jobKey);
        } catch (SchedulerException e) {
            e.printStackTrace();
        }
    }

课时八十七、Spring Boot 2.0 quartz:任务动态管理-修改

1、前言

在前面小节介绍了如何删除,那么有时间,我们并不是要删除,而是觉得定时的时间不对,所以要进行修改下定时时间

2、实现方式

删除&添加

先删除任务,在添加一个任务,这种方式是最简单的:
deleteJob()
addJob()

使用rescheduleJob

TriggerKey triggerKey = TriggerKey.triggerKey(triggerName,triggerGroupName);
        try {
            CronTrigger trigger = (CronTrigger)scheduler.getTrigger(triggerKey);
            if(trigger == null) {
                return null;
            }
            String oldCronExpression = trigger.getCronExpression();
            if(oldCronExpression.equals(cronExpression)) {
                return null;
            }else {
                trigger = (CronTrigger)TriggerBuilder.newTrigger().withIdentity(triggerKey).withSchedule(CronScheduleBuilder.cronSchedule(cronExpression)).build();
                return scheduler.rescheduleJob(triggerKey, trigger);
            }
        } catch (SchedulerException e) {
            e.printStackTrace();
            return null;
        }

3、代码实现

删除&添加

    /**
     * 修改定时任务的时间.
     * @param jobName
     * @param jobGroupName
     * @param triggerName
     * @param triggerGroupName
     */
    public void modifyJobTime(String jobName,String jobGroupName,String triggerName,String triggerGroupName,String cronExpression) {
        Scheduler scheduler = schedulerFactoryBean.getScheduler();
        /*
         * 第一种方式: 删除&添加
         * 在删除之前就需要先获取到JobDetail,否者就无法获取了.
         */
        /*try {
            JobDetail jobDetail = scheduler.getJobDetail(JobKey.jobKey(jobName, jobGroupName));
            deleteJob(jobName, jobGroupName, triggerName, triggerGroupName);
            addJob(jobName, jobGroupName, triggerName, triggerGroupName, jobDetail.getJobClass(), cronExpression);
        } catch (SchedulerException e) {
            e.printStackTrace();
        }*/}

使用rescheduleJob

    
        TriggerKey triggerKey = TriggerKey.triggerKey(triggerName,triggerGroupName);
        try {
            CronTrigger trigger = (CronTrigger)scheduler.getTrigger(triggerKey);
            String oldCronExpression = trigger.getCronExpression();
            if(oldCronExpression.equals(cronExpression)) {
                return;
            }
            
            trigger = TriggerBuilder.newTrigger().withIdentity(triggerKey).withSchedule(CronScheduleBuilder.cronSchedule(cronExpression)).build();
            scheduler.rescheduleJob(triggerKey, trigger);
        } catch (SchedulerException e) {
            e.printStackTrace();
        }
        
    }

课时八十八、Spring Boot 2.0 quartz:任务动态管理-启动停止所有任务

在前面一节介绍了动态任务修改时间,这节讲讲如何停止和启动所有的定时任务。

1、编码实现

这里会有三个方法:startJobs、shutdownJobs、standby,先看下具体的代码实现:

2、startJobs

/**
     * 启动所有的定时任务.
     * 这个是配合standby一起使用的,
     * 当job处于standby模式的时候,调用startJobs可以恢复定时任务.
     */
    public void startJobs() {
        Scheduler scheduler  = schedulerFactoryBean.getScheduler();
        try {
            scheduler.start();
        } catch (SchedulerException e) {
            e.printStackTrace();
        }
    }

3、shutdownJobs

/**
     * 关闭所有的定时任务.
     * 注意:一旦被shutdown之后,就不能调用startJobs.
     */
    public void shutdownJobs() {
        Scheduler scheduler  = schedulerFactoryBean.getScheduler();
        try {
            if(!scheduler.isShutdown()) {
                scheduler.shutdown();
            }
        } catch (SchedulerException e) {
            e.printStackTrace();
        }
    }

4、standby

/**
     * 将定时任务设置为待机或者备用状态,暂停的模式.
     * 可以使用start进行恢复.
     */
    public void standby() {
        Scheduler scheduler  = schedulerFactoryBean.getScheduler();
        try {
            scheduler.standby();
        } catch (SchedulerException e) {
            e.printStackTrace();
        }
    }

 

参考代码

springboot2-quartz

猜你喜欢

转载自blog.csdn.net/weixin_38492276/article/details/81146911
今日推荐