修改配置文件-job配置的任务调度器为集群任务调度器

  一直在跟进的项目中的任务调度框架用的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以后进行属性注入。

 

猜你喜欢

转载自www.cnblogs.com/bzq-nancy/p/8854329.html
今日推荐