Springboot+Quartz(四)--为job自动装配spring的bean

前言:在上一篇文章中我们发现当使用StdSchedulerFactory初始化Scheduler的时候,Job中注入的bean为null。
此问题是:定时任务Job的作业类中无法注入Service等由Spring容器所管理的Bean,如以下情况:

@JobUnit(jobName = "QuartzJob1", jobGroup = "QuartzJob", jobCorn = "*/5 * * * * ?", jobDesc = "Quartz学习")
public class QuartzJob1 implements Job {

    private static final Logger logger = LoggerFactory.getLogger(QuartzJob1.class);

    @Autowired
    private TestAutowired testAutowired; // 此时为null

    @Override
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        logger.info("job start");
        JobKey key = jobExecutionContext.getJobDetail().getKey();
        JobDataMap jobDataMap = jobExecutionContext.getJobDetail().getJobDataMap();
        QuartzJobUnit quartzJobUnit = (QuartzJobUnit) jobDataMap.get("scheduleJob");
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println(sdf.format(new Date()));
        System.out.println(quartzJobUnit.toString());
        System.out.println(testAutowired.getMsg());
    }
}

通过从网上搜索,发现是以下原因所导致:定时任务Job对象的实例化过程是在Quartz中进行的,而TaskCronJobService Bean是由Spring容器管理的,Quartz根本就察觉不到TaskCronJobService Bean的存在,故而无法将TaskCronJobService Bean装配到Job对象中。

知道了问题出现的原因,解决的办法也就显而易见了:如果能够将Job Bean也纳入到Spring容器的管理之中的话,Spring容器自然能够为Job Bean自动装配好所需的依赖。

SchedulerFactoryBean

通过查看Spring官方文档得知,Spring与Quartz集成使用的是SchedulerFactoryBean这个类,
SchedulerFactoryBean 使用 AdaptableJobFactory 对Job对象进行实例化,如果未指定则SchedulerFactoryBean会自动创建一个,在这里如果我们能够将 SchedulerFactoryBean 的 jobFactory 指定为我们自定义的工厂实例的话,我们就能够有机会在Job实例化完成之后对其进行处理,并将其纳入到Spring容器的管理之中。

例如下面这段代码,创建一个SchedulerFactoryBean 实例,并将其Job实例化的工厂指定为一个Spring容器中一个自定义的 QuartzCustomAdaptableJobFactory 实例。

@Configuration
@AutoConfigureAfter(value = {QuartzCustomAdaptableJobFactory.class})
public class QuartzConfiguration {
    /*@Bean(name = "scheduler")
    public Scheduler scheduler() throws Exception {
        Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
        scheduler.getListenerManager().addSchedulerListener(new QuartzCustomSchedulerListener());
        scheduler.getListenerManager().addJobListener(new JobMonitorListener());
        return scheduler;
    }*/

    @Bean(value = "schedulerFactory")
    public SchedulerFactoryBean schedulerFactoryBean(@Qualifier("quartzCustomAdaptableJobFactory") QuartzCustomAdaptableJobFactory quartzCustomAdaptableJobFactory) {
        SchedulerFactoryBean schedulerFactoryBean = new SchedulerFactoryBean();
        schedulerFactoryBean.setJobFactory(quartzCustomAdaptableJobFactory);

        return schedulerFactoryBean;
    }

    @Bean(name = "scheduler")
    public Scheduler scheduler(@Qualifier("schedulerFactory") SchedulerFactoryBean schedulerFactory) throws Exception {
        Scheduler scheduler = schedulerFactory.getScheduler();
        scheduler.getListenerManager().addSchedulerListener(new QuartzCustomSchedulerListener());
        scheduler.getListenerManager().addJobListener(new JobMonitorListener());
        return scheduler;
    }
}
QuartzCustomAdaptableJobFactory

Quartz为我们提供了一个JobFactory接口,允许我们自定义实现创建Job的逻辑。

package org.quartz.spi;
public interface JobFactory {
	Job newJob(TriggerFiredBundle bundle, Scheduler scheduler) throws SchedulerException;
}

AdaptableJobFactory 就是 Spring 为我们提供的一个该接口的实现类,提供了创建Job实例的基本方法。

自定义的工厂类 TaskSchedulerFactory 只需要继承 AdaptableJobFactory ,通过调用父类 AdaptableJobFactory 的方法来实现对Job的实例化,在Job实例化完以后,再调用自身方法为创建好的Job实例进行属性自动装配并将其纳入到Spring容器的管理之中。

创建好的 QuartzCustomAdaptableJobFactory 代码如下,

@Component(value = "quartzCustomAdaptableJobFactory")
public class QuartzCustomAdaptableJobFactory extends AdaptableJobFactory {

    @Autowired
    private AutowireCapableBeanFactory capableBeanFactory;

    @Override
    protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception {
        //实例化对象
        Object jobInstance = super.createJobInstance(bundle);
        //进行注入,交给spring管理该bean
        capableBeanFactory.autowireBean(jobInstance);
        return jobInstance;
    }
}

摘用:https://blog.csdn.net/pengjunlee/article/details/78965877#commentsedit

你可能感兴趣的:(quartz,+,batch)