springboot 集成quartz job spring注入

由于quartz的装载优先于spring注解,即定时器优先于spring的@Autowire 所以导致使用此方法注入的bean为null。

报错信息如下:



配置方法如下:

package com.gdlt.cloud;

import org.quartz.spi.TriggerFiredBundle;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.scheduling.quartz.AdaptableJobFactory;
import org.springframework.scheduling.quartz.SpringBeanJobFactory;
import org.springframework.stereotype.Component;

//quartz的job中使用autowired注解注入的对象为空,这时候我们就要使用spring-quartz提供的AdaptableJobFactory类。
//@Component把普通pojo实例化到spring容器中,相当于配置文件中的 <bean id="" class=""/>)
@Component
public class AutowireJobFactory extends AdaptableJobFactory{
	
		@Autowired
	    private AutowireCapableBeanFactory capableBeanFactory;

	    @Override
	    protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception {
	        // 调用父类的方法
	        Object jobInstance = super.createJobInstance(bundle);
	        // 进行注入
	        capableBeanFactory.autowireBean(jobInstance);
	        return jobInstance;
	    }

}


package com.gdlt.cloud;

import java.io.IOException;
import java.util.Properties;

import org.quartz.Scheduler;
import org.quartz.ee.servlet.QuartzInitializerListener;
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 SchedulerConfig {
	
	@Autowired
    private AutowireJobFactory autowireJobFactory;
		
	
    @Bean(name="SchedulerFactory")
    public SchedulerFactoryBean schedulerFactoryBean() throws IOException {
        SchedulerFactoryBean factory = new SchedulerFactoryBean();
        // 延时启动
        factory.setStartupDelay(20);

        // 加载quartz数据源配置
        factory.setQuartzProperties(quartzProperties());

        // 自定义Job Factory,用于Spring注入
        factory.setJobFactory(autowireJobFactory);
        
        return factory;
    }
    /**
     * 加载quartz数据源配置
     * 
     * @return
     * @throws IOException
     */
    @Bean
    public Properties quartzProperties() throws IOException {
        PropertiesFactoryBean propertiesFactoryBean = new PropertiesFactoryBean();
        propertiesFactoryBean.setLocation(new ClassPathResource("/quartz.properties"));
        //在quartz.properties中的属性被读取并注入后再初始化对象
        propertiesFactoryBean.afterPropertiesSet();
        return propertiesFactoryBean.getObject();
    }
  
    /*
     * quartz初始化监听器
     */
    @Bean
    public QuartzInitializerListener executorListener() {
       return new QuartzInitializerListener();
    }
    
    /*
     * 通过SchedulerFactoryBean获取Scheduler的实例
     */
    @Bean(name="Scheduler")
    public Scheduler scheduler() throws IOException {
        return schedulerFactoryBean().getScheduler();
    }

}

在你的定时器config里面,注意上面标注颜色的代码是否正确,没有添上,就可以了

猜你喜欢

转载自blog.csdn.net/qq_40562912/article/details/80911828