`

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

阅读更多

 

 

【最新动态】

 

 SpringBoot微信公众号最新更新201. Spring Boot JNDI:Spring Boot中怎么玩JNDI

 

à Spring Boot 2.0 之Spring Data 和JPA视频

 

 

说明:

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

(2)Quartz版本:2.3.0

 

 

前言:

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

     

一、需求分析

       虽然当下我们只需要注释掉定时任务的一两行代码,但是也经不起每次的注释掉再打开的折磨,所以从长期维护和管理的角度来说的,这个需求我们还是要满足的。那么就要了解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 this identification.

 

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

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

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

 

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

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

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

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

 

à悟空学院:https://t.cn/Rg3fKJD

学院中有Spring Boot相关的课程!点击「阅读原文」进行查看!

SpringBoot视频:http://t.cn/A6ZagYTi

Spring Cloud视频:http://t.cn/A6ZagxSR

SpringBoot Shiro视频:http://t.cn/A6Zag7IV

SpringBoot交流平台:https://t.cn/R3QDhU0

SpringData和JPA视频:http://t.cn/A6Zad1OH

SpringSecurity5.0视频:http://t.cn/A6ZadMBe

Sharding-JDBC分库分表实战http://t.cn/A6ZarrqS

 

分布式事务解决方案「手写代码」:http://t.cn/A6ZaBnIr

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics