首页 文章资讯内容详情

Quartz与Spring集成 Job如何自动注入Spring容器托管的对象

2026-06-01 2 花语

本文内容纲要:

- -测试环境Spring3M2quartz-2.1.7 - -我们要达到这样的效果 -但是Job对象的实例化过程是在Quartz中进行的,AppOrderService是在Spring容器当中的,那么如何将他们关联到一起呢。好在Quartz提供了JobFactory接口,让我们可以自定义实现创建Job的逻辑。 -那么我们通过实现JobFactory接口,在实例化Job以后,在通过ApplicationContext将Job所需要的属性注入即可 -在Spring与Quartz集成时用到的是org.springframework.scheduling.quartz.SchedulerFactoryBean这个类。源码如下,我们只看最关键的地方。 -其中红色标记的是重点,如果我们不指定jobFactory,那么Spring就使用AdaptableJobFactory。我们在来看一下这个类的实现 -其他的我们都不管,我们就看红色的地方,这里是创建了一个Job,那我们就在这里去给Job的属性进行注入就可以了,让我们写一个类继承它,然后复写这个方法进行对Job的注入。 -接下来把他配置到Spring当中去 -然后在把org.springframework.scheduling.quartz.SchedulerFactoryBean的jobFactory设置成我们自己的。 -这样就完成了Spring对Job的注入功能,其实很简单,原理就是在我们扩展JobFactory创建job的方法,在创建完Job以后进行属性注入。

测试环境Spring3M2quartz-2.1.7

我们要达到这样的效果

publicclassCancelUnpaidOrderTaskimplementsJob{ @Autowired privateAppOrderServiceorderService; @Override publicvoidexecute(JobExecutionContextctx)throwsJobExecutionException{ ... }

但是Job对象的实例化过程是在Quartz中进行的,AppOrderService是在Spring容器当中的,那么如何将他们关联到一起呢。好在Quartz提供了JobFactory接口,让我们可以自定义实现创建Job的逻辑。

publicinterfaceJobFactory{ JobnewJob(TriggerFiredBundlebundle,Schedulerscheduler)throwsSchedulerException; }

那么我们通过实现JobFactory接口,在实例化Job以后,在通过ApplicationContext将Job所需要的属性注入即可

在Spring与Quartz集成时用到的是org.springframework.scheduling.quartz.SchedulerFactoryBean这个类。源码如下,我们只看最关键的地方。

//GetSchedulerinstancefromSchedulerFactory. try{ this.scheduler=createScheduler(schedulerFactory,this.schedulerName); populateSchedulerContext(); if(!this.jobFactorySet&&!(this.schedulerinstanceofRemoteScheduler)){ //UseAdaptableJobFactoryasdefaultforalocalScheduler,unlesswhen //explicitlygivenanullvaluethroughthe"jobFactory"beanproperty. this.jobFactory=newAdaptableJobFactory(); } if(this.jobFactory!=null){ if(this.jobFactoryinstanceofSchedulerContextAware){ ((SchedulerContextAware)this.jobFactory).setSchedulerContext(this.scheduler.getContext()); } this.scheduler.setJobFactory(this.jobFactory); } }

其中红色标记的是重点,如果我们不指定jobFactory,那么Spring就使用AdaptableJobFactory。我们在来看一下这个类的实现

packageorg.springframework.scheduling.quartz; importjava.lang.reflect.Method; importorg.quartz.Job; importorg.quartz.Scheduler; importorg.quartz.SchedulerException; importorg.quartz.spi.JobFactory; importorg.quartz.spi.TriggerFiredBundle; importorg.springframework.util.ReflectionUtils; publicclassAdaptableJobFactoryimplementsJobFactory{ publicJobnewJob(TriggerFiredBundlebundle,Schedulerscheduler)throwsSchedulerException{ returnnewJob(bundle); } publicJobnewJob(TriggerFiredBundlebundle)throwsSchedulerException{ try{ ObjectjobObject=createJobInstance(bundle); returnadaptJob(jobObject); } catch(Exceptionex){ thrownewSchedulerException("Jobinstantiationfailed",ex); } } protectedObjectcreateJobInstance(TriggerFiredBundlebundle)throwsException{ //ReflectivelyadaptingtodifferencesbetweenQuartz1.xandQuartz2.0... MethodgetJobDetail=bundle.getClass().getMethod("getJobDetail"); ObjectjobDetail=ReflectionUtils.invokeMethod(getJobDetail,bundle); MethodgetJobClass=jobDetail.getClass().getMethod("getJobClass"); ClassjobClass=(Class)ReflectionUtils.invokeMethod(getJobClass,jobDetail); returnjobClass.newInstance(); } protectedJobadaptJob(ObjectjobObject)throwsException{ if(jobObjectinstanceofJob){ return(Job)jobObject; } elseif(jobObjectinstanceofRunnable){ returnnewDelegatingJob((Runnable)jobObject); } else{ thrownewIllegalArgumentException("Unabletoexecutejobclass["+jobObject.getClass().getName()+ "]:only[org.quartz.Job]and[java.lang.Runnable]supported."); } } }

其他的我们都不管,我们就看红色的地方,这里是创建了一个Job,那我们就在这里去给Job的属性进行注入就可以了,让我们写一个类继承它,然后复写这个方法进行对Job的注入。

publicclassMyJobFactoryextendsAdaptableJobFactory{ //这个对象Spring会帮我们自动注入进来,也属于Spring技术范畴. @Autowired privateAutowireCapableBeanFactorycapableBeanFactory; protectedObjectcreateJobInstance(TriggerFiredBundlebundle)throwsException{ //调用父类的方法 ObjectjobInstance=super.createJobInstance(bundle); //进行注入,这属于Spring的技术,不清楚的可以查看Spring的API. capableBeanFactory.autowireBean(jobInstance); returnjobInstance; } }

接下来把他配置到Spring当中去

<beanid="jobFactory"class="com.gary.operation.jobdemo.demo1.MyJobFactory"></bean>

然后在把org.springframework.scheduling.quartz.SchedulerFactoryBean的jobFactory设置成我们自己的。

<beanname="MyScheduler"class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <!--其他属性省略--> <propertyname="jobFactory"ref="jobFactory"></property> </bean>

这样就完成了Spring对Job的注入功能,其实很简单,原理就是在我们扩展JobFactory创建job的方法,在创建完Job以后进行属性注入。

本文内容总结:,测试环境Spring3M2quartz-2.1.7,,我们要达到这样的效果,但是Job对象的实例化过程是在Quartz中进行的,AppOrderService是在Spring容器当中的,那么如何将他们关联到一起呢。好在Quartz提供了JobFactory接口,让我们可以自定义实现创建Job的逻辑。,那么我们通过实现JobFactory接口,在实例化Job以后,在通过ApplicationContext将Job所需要的属性注入即可,在Spring与Quartz集成时用到的是org.springframework.scheduling.quartz.SchedulerFactoryBean这个类。源码如下,我们只看最关键的地方。,其中红色标记的是重点,如果我们不指定jobFactory,那么Spring就使用AdaptableJobFactory。我们在来看一下这个类的实现,其他的我们都不管,我们就看红色的地方,这里是创建了一个Job,那我们就在这里去给Job的属性进行注入就可以了,让我们写一个类继承它,然后复写这个方法进行对Job的注入。,接下来把他配置到Spring当中去,然后在把org.springframework.scheduling.quartz.SchedulerFactoryBean的jobFactory设置成我们自己的。,这样就完成了Spring对Job的注入功能,其实很简单,原理就是在我们扩展JobFactory创建job的方法,在创建完Job以后进行属性注入。,

原文链接:https://www.cnblogs.com/daxin/p/3608320.html