zoukankan      html  css  js  c++  java
  • Spring Boot集成Quartz注入Spring管理的类

    摘要: 在Spring Boot中使用Quartz时,在JOB中一般需要引用Spring管理的Bean,通过定义Job Factory实现自动注入

    Spring有自己的Schedule定时任务,在Spring boot中使用的时候,不能动态管理JOB,于是就使用Quartz来实现。

    在Spring Boot中配置Quartz:

    import java.io.IOException;
    import java.util.Properties;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.beans.factory.config.PropertiesFactoryBean;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.core.io.ClassPathResource;
    import org.springframework.scheduling.annotation.EnableScheduling;
    import org.springframework.scheduling.quartz.SchedulerFactoryBean;
    
    @Configuration
    @EnableScheduling
    public class QuartzSchedule {
    
        @Autowired
        private MyJobFactory myJobFactory;
    
        @Bean
        public SchedulerFactoryBean schedulerFactoryBean() throws IOException {
            SchedulerFactoryBean factory = new SchedulerFactoryBean();
    
            factory.setOverwriteExistingJobs(true);
    
            // 延时启动
            factory.setStartupDelay(20);
    
            // 加载quartz数据源配置
            factory.setQuartzProperties(quartzProperties());
    
            // 自定义Job Factory,用于Spring注入
            factory.setJobFactory(myJobFactory);
    
            return factory;
        }
    
        /**
         * 加载quartz数据源配置
         * 
         * @return
         * @throws IOException
         */
        @Bean
        public Properties quartzProperties() throws IOException {
            PropertiesFactoryBean propertiesFactoryBean = new PropertiesFactoryBean();
            propertiesFactoryBean.setLocation(new ClassPathResource("/quartz.properties"));
            propertiesFactoryBean.afterPropertiesSet();
            return propertiesFactoryBean.getObject();
        }
    
    }

    为了在JOB中使用Spring管理的Bean,需要重新定义一个Job Factory:

    @Component
    public class MyJobFactory extends AdaptableJobFactory {
        
        @Autowired
        private AutowireCapableBeanFactory capableBeanFactory;
    
        @Override
        protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception {
            // 调用父类的方法
            Object jobInstance = super.createJobInstance(bundle);
            // 进行注入
            capableBeanFactory.autowireBean(jobInstance);
            return jobInstance;
        }
    }

    然后在JOB中就可以使用Spring管理的Bean了

    public class MyJob implements Job, Serializable {
        private static final long serialVersionUID = 1L;
        private Logger logger = LoggerFactory.getLogger(this.getClass());
    
        @Autowired
        private SomeService someService;
    
        @Override
        public void execute(JobExecutionContext context) throws JobExecutionException {
            someService.doSomething();
        }
    }

    下面代码是创建JOB:

    JobDetail jobDetail = JobBuilder.newJob(((Job) Class.forName(job.getClazz()).newInstance()).getClass())
                        .withIdentity(job.getJobName(), job.getJobGroup()).build();
                jobDetail.getJobDataMap().put("extdata", job.getExtData());
    
                // 表达式调度构建器
                CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(job.getCronExpression())
                        .withMisfireHandlingInstructionDoNothing();
                // 构建一个trigger
                TriggerBuilder<CronTrigger> triggerBuilder = TriggerBuilder.newTrigger().withIdentity(triggerKey)
                        .withSchedule(scheduleBuilder);
                if (job.getStartTime() != null) {
                    triggerBuilder.startAt(job.getStartTime());
                }
                if (job.getEndTime() != null) {
                    triggerBuilder.endAt(job.getEndTime());
                }
                CronTrigger trigger = triggerBuilder.build();
    
                scheduler.scheduleJob(jobDetail, trigger);// 注入到管理类

     https://my.oschina.net/hhaijun/blog/698498

  • 相关阅读:
    时序图和类图
    word文档一个表格分割成两个表格
    Spring 报错:Error creating bean with name
    怎么让线条快速选中并组合多个形状
    [扩展阅读] Python 函数修饰符(装饰器)的使用
    第039 类和对象 拾遗
    吴恩达深度学习 第一课第三周课后编程作业
    第038讲:类和对象:继承 课后测试题及答案
    廖雪峰Python教程--使用模块
    第037讲:类和对象:面向对象编程
  • 原文地址:https://www.cnblogs.com/wlsblog/p/8046931.html
Copyright © 2011-2022 走看看