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

  • 相关阅读:
    ps制作gif
    安装pycocotools错误
    labelimg最新版本的使用攻略
    1_0day安全漏洞分析技术学习_二进制文件概述_笔记
    2.陈治瑄问题,汉字写入数据库报错。这个汉字有什么特殊的吗?
    1.PHP中报出use of undefined constant count
    [转] 关于Multi-head的为什么
    [转] GPT、GPT-2到GPT-3概览
    [转] RoBERTa介绍
    [转] ELMo原理解析及简单上手使用
  • 原文地址:https://www.cnblogs.com/wlsblog/p/8046931.html
Copyright © 2011-2022 走看看