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

  • 相关阅读:
    完美图解教程 Linux环境VNC服务安装、配置与使用
    c语言中<stdbool.h>的使用
    UNIX文件结构(转自UNIX/AIX操作系统基础教程)
    umask
    在AIX环境为Oracle表空间增加裸设备(逻辑卷)
    面的面积大小合线的长度的判断。
    不用新浪博客了。以后的日常感悟也在这里写了, 新浪太烂了。 (感叹也没用,什么都写不出来。 )
    轴心工具的做法。
    选择因素随机的判断。
    上面发的那个完整版变量还有问题,难道我不是用英文输入法, 电脑不说谎 ,看来我是大意了。下面是最终版。
  • 原文地址:https://www.cnblogs.com/wlsblog/p/8046931.html
Copyright © 2011-2022 走看看