任务动态调度的实现

1.任务动态调度的实现
springboot-quartz工程传统的Spring方式集成,由于任务信息全部配置在xml文件中,如果需要操作任务或者修改任务运行频率,只能重新编译、打包、部署、重启,如果有紧急问题需要处理,会浪费很多的时间。有没有可以动态调度任务的方法?比如停止一个Job?启动一个Job?修改Job的
触发频率?读取配置文件、写入配置文件、重启Scheduler或重启应用明显是不可取的。对于这种频繁变更并且需要实时生效的配置信息,我们可以放到哪里?ZK、Redis、DBtables。并且,我们可以提供一个界面,实现对数据表的轻松操作。
1.1配置管理
依据JobDetail的属性创建对应的数据库表
1.2数据操作与任务调度
操作数据表非常简单,SSM增删改查。但是在修改了表的数据之后,怎么让调度器知道呢?调度器的接口:Scheduler在我们的需求中,我们需要做的事情:1、新增一个任务2、删除一个任务3、启动、
停止一个任务4、修改任务的信息(包括调度规律)因此可以把相关的操作封装到一个工具类中。
com.gupaoedu.demo.util.SchedulerUtil
1.3容器启动与Service注入
容器启动
因为任务没有定义在ApplicationContext.xml中,而是放到了数据库中,SpringBoot启动时,怎么读取任务信息?或者,怎么在Spring启动完成的时候做一些事情?创建一个类,实现CommandLineRunner
接口,实现run方法。从表中查出状态是1的任务,然后构建。
Service类注入到Job中
SpringBean如何注入到实现了Job接口的类中?例如在TestTask3中,需要注入ISysJobService,查询数据库发送邮件。如果没有任何配置,注入会报空指针异常。
原因:
因为定时任务Job对象的实例化过程是在Quartz中进行的,而ServiceBean是由Spring容器管理的,Quartz察觉不到ServiceBean的存在,所以无法将ServiceBean装配到Job对象中。
分析:
Quartz集成到Spring中,用到SchedulerFactoryBean,其实现了InitializingBean方法,在唯一的方法
afterPropertiesSet()在Bean的属性初始化后调用。调度器用AdaptableJobFactory对Job对象进行实例化。所以,如果我们可以把这个JobFactory指定为我们自定义的工厂的话,就可以在Job实例化完成之后,把Job纳入到Spring容器中管理。
解决这个问题的步骤:
1)、定义一个AdaptableJobFactory,实现JobFactory接口,实现接口定义的newJob方法,在这里面返回Job实例
在这里插入图片描述
2)、定义一个MyJobFactory,继承AdaptableJobFactory。使用Spring的AutowireCapableBeanFactory,把Job实例注入到容器中。
在这里插入图片描述
3)、指定Scheduler的JobFactory为自定义的JobFactory。com.gupaoedu.demo.config.InitStartSchedule中:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值