192. Spring Boot 2.0 quartz:任务动态管理-添加_程序员

【视频&交流平台】

à Spring Boot视频

http://study.163.com/course/introduction.htm?courseId=1004329008&utm_campaign=commission&utm_source=400000000155061&utm_medium=share

à Spring Cloud视频

http://study.163.com/course/introduction.htm?courseId=1004638001&utm_campaign=commission&utm_source=400000000155061&utm_medium=share

à Spring Boot源码

https://gitee.com/happyangellxq520/spring-boot

à Spring Boot交流平台

http://412887952-qq-com.iteye.com/blog/2321532

 

说明:

(1)Spring Boot 版本:2.0.0.RELEASE;

(2)Quartz版本:2.3.0

 

前言:

 

       在前面我们讲到了任务的持久化了,但是在实际项目中,我们的PD还是会提出更高的需求的,比如:这个任务突然间,我不想要了,我想删除掉,但我也理解程序猿(媛)的痛苦,也不想让你们改代码,能不能给我按钮,我自己操作。程序员哥哥和程序员美眉听到后: 我的哥呀,我还是改代码吧,注释一行就搞定的事情,为什么这么折磨俺呢?

 

 

 

一、需求分析

       虽然当下我们只需要注释掉定时任务的一两行代码,但是也经不起每次的注释掉再打开的折磨,所以从长期维护和管理的角度来说的,这个需求我们还是要满足的。那么就要了解PD的要求了,到底想要什么?就是任务能够动态的进行管理

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

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

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

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

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

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

       哦了,这需求实在是太清楚了,哥哥,你好棒哦……

 

二、编码思路

       需求明确,那么就是编码,那么如何动态任务添加呢?

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

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

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

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

       好了这里,你是不是已经知道如何进行编码了?那就说到这里吧,我闪了….

……

……

 

三、动态任务管理:动态添加任务

       老师:“小蚂蚁(为啥不是小姨子捏,这不小姨子跟着浙江温州皮革厂的老板跑路了嘛),写好了嘛….我看看,写的不错,差不多就是这个意思了。”

那我们来看看小蚂蚁的代码(代码支持,手机端左右滑动):

@Service
public class QuartzJobManager {
    @Autowired
    private SchedulerFactoryBean schedulerFactoryBean;


    public Date addJob(String jobName,String jobGroupName,String triggerName,String triggerGroupName,Class jobClass, String cronExpression) {

        Scheduler scheduled =  schedulerFactoryBean.getScheduler();

        //job定义: // 任务名,任务组,任务执行类
        JobDetail jobDetail = JobBuilder.newJob(jobClass).withIdentity(jobName, jobGroupName).build();

        //触发器构建
        Trigger trigger = TriggerBuilder.newTrigger().withIdentity(triggerName, triggerGroupName).withSchedule(CronScheduleBuilder.cronSchedule(cronExpression)).build();
        try {
            return scheduled.scheduleJob(jobDetail, trigger);
        } catch (SchedulerException e) {
            e.printStackTrace();
            return null;
        }
    }
}    

 

老师:“小蚂蚁,写的不错,大体就是这样子的,为啥有一个返回值呢?还是date类型的?”

 

小蚂蚁:“老师,你就不懂了,这个叫做:Compute First Fire Time。”

 

老师:“纳尼,这是虾米鬼?”

 

小蚂蚁:“^_^,老师你也有不懂的时候呀,这个叫“第一次射的时间”?”

 

老师:“什么‘第一次射的时间’,小蚂蚁你又调皮了,好好说人话。”

 

小蚂蚁:“是的,老师,这个呢,叫做‘第一次触发时间: 是schedule在启动时会调用的计算触发器第一次触发的时间。“

 

老师:“SO DES NI, 小蚂蚁你真是聪明,老师看好你。老师还有问题要问题:如果重复执行添加任务,也就是多次调用了addJob会怎么样呢?”

 

小蚂蚁:老师,就知道你会问我这个问题,这个嘛?多次添加的话,参数一样的情况下,后一次添加的是无法正常添加的,会抛出一个异常(此异常不会影响到已经在运行的定时任务的):

 

 

Unable to store Job : 'myjob.myjob2', because one already exists with thisidentification. 

 

 

我什么都不想说了,小蚂蚁你已经出师了…. 不需要为师了…. 剩下的路你靠你自己走吧,你就是你,一只让我骄傲的小蚂蚁。

 

       老师你看,有了小蚂蚁的这个addJob方法,那么就可以在别的地方进行调用,添加一个任务啦:  

 

quartzJobManager.addJob("myjob2","myjob", "myjob2Trigger","myjobTrigger", MyJob2.class, "0/3 * * * * ?"); 

 

 

       老师:“好了,小蚂蚁剩下的就你自己搞了,老师要回家吃饭了”。

 

小蚂蚁:”革命尚未成功,回家吃什么饭,况且家里有饭吃嘛。”

 

老师:”小蚂蚁,你在嘀咕什么?老师,没,没什么,你老,一路走好”。

 

小蚂蚁:”什么?你是要气死为师嘛(咳嗽声….

 

Quartz视频集

第十九章 Spring Boot 2.0:Quartz
1、Spring Boot2.0 新特性
2、Spring Boot 2.0小彩蛋 :动态 banner
3、Spring Boot 2.0 quartz:hello world
4、Spring Boot 2.0 quartz:job data property和inject service
5、Spring Boot 2.0 quartz:Job持久化

第二十章 Spring Boot 2.0:Quartz持久化:动态任务管理
1、Spring Boot 2.0 quartz:任务动态管理-添加
2、Spring Boot 2.0 quartz:任务动态管理-删除
3、Spring Boot 2.0 quartz:任务动态管理-修改
4、Spring Boot 2.0 quartz:任务动态管理-启动停止所有任务