一直在跟进的项目中的任务调度框架用的Quarz,最开始使用配置文件-job配置单机Quarz调度,随着需求增加配置文件中的任务配置也随之增多,
突然某一天得知我们系统要布置成集群模式的,这就意味着我得修改Quarz为集群模式的,然后因为本人为了图省事不愿意把配置文件中配置的job任
务改成代码形式的,比如:addJob(String jobName, String jobGroupName, String triggerName, String triggerGroupName, Class jobClass) {、、、}。
所以就开始着手:修改配置文件-job配置的任务调度器为集群任务调度器。
一、单机模式的配置(单机模式的quarz调度信息、状态默认存于内存中)
1、job配置
2、Scheduler调度
二、修改单机模式的配置为集群模式配置
备注:关于Spring集成Quartz有2种方法: JobDetailFactoryBean和 MethodInvokeJobDetailFactoryBean ,前面单机模式的配置采用的MethodInvokeJobDetailFactoryBean方式
但集群模式的配置须修改MethodInvokeJobDetailFactoryBean 方式为 JobDetailFactoryBean,因为MethodInvokeJobDetailFactoryBean 创建的JobDetails不是可序列化的,
因此不适合持久的工作存储,所以对于持久化的job需要自己继承org.springframework.scheduling.quartz.QuartzJobBean,同时修改JobDetail对应的Class为JobDetailFactoryBean
当然也得修改符合JobDetailFactoryBean类对应的属性填充,比如targetObject改成jobClass
1、修改实体job继承QuartzJobBean重写executeInternal(),JobDetailFactoryBean会自动调用executeInternal()
2、修改job配置(修改MethodInvokeJobDetailFactoryBean 方式为 JobDetailFactoryBean)
3、Scheduler调度:修改配置文件-job配置的任务调度器(内存调度)为集群任务调度器
3.1、集群的 quarz-scheduler 配置
3.2、job配置(为TaskManage的scheduler属性设置值为commonSchedulerFactoryBean,commonSchedulerFactoryBean是配置成集群模式的Quarz-scheduler)
3.3、TaskManage类(使用配置好的集群模式的调度器-scheduler加入任务到Quarz中)
备注:TaskManage类其实做的一件事就是,使用集群模式的调度器去添加任务让Quarz去调度
4、 spring quartzy的spring注入问题(dao层和service层)
在真正的job实现类中经常会使用spring去注入Bean对象,本人的以下代码测试最初经常遇到dao层和service层实例为NULL,代码示例:
解决方法:
后来网上查询得知是因为Job对象的实例化过程是在Quartz中进行的,Bean对象是在Spring容器当中的,Spring在加载的时候先加载Quarzy,后加载Bean对象。
可以参考以下两个链接进行详细了解:
参考文档1: https://blog.csdn.net/maiyikai/article/details/70199668
参考文档2: http://www.cnblogs.com/daxin/p/3608320.html
◆ 所以如果我们不指定jobFactory,那么Spring默认就使用AdaptableJobFactory
而AdaptableJobFactory类只是简单的创建一个Job,并未对Bean进行注入
◆ 所以解决方法来了,我们就在这里去给Job的属性进行注入就可以了,让我们写一个类继承AdaptableJobFactory类,然后复写createJobInstance()这个方法
进行对Job的注入,先调用父类的方法创建Job,然后对Job类依赖的Bean进行注入:
接下来把他配置到Spring当中去
最后在TaskManage类对jobFactory属性进行设置,把SchedulerFactoryBean的jobFactory设置成我们自己的,该类的scheduler属性前面提到过等于
commonSchedulerFactoryBean即提前配置好的集群的quarz-scheduler Bean配置,其类型是SchedulerFactoryBean,这里我们对SchedulerFactoryBean
的jobFactory属性进行设置即可:
这样就完成了Spring对Job的注入功能,其实很简单,原理就是在我们扩展JobFactory创建job的方法,在创建完Job以后进行属性注入。