Quartz与Spring集成 Job如何自动注入Spring容器托管的对象
本文内容纲要:
-
-测试环境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