使用SchedulerFactoryBean集成Quarz Job与Spring

使用SchedulerFactoryBean集成Quarz Job与Spring本文介绍QuartzJob与Spring的集成。[list][*]QuartzJob官网:[url]http://quartz-scheduler.org[/url][*]Spring官网:[url]https://spring.io[/url][*][b]SchedulerFactoryBeanJavaDoc:[/b][url]http://docs.spring.i…

大家好,又见面了,我是你们的朋友全栈君。本文介绍Quartz Job与Spring的集成。

[list]

[*]Quartz Job官网:[url]http://quartz-scheduler.org[/url]

[*]Spring官网:[url]https://spring.io[/url]

[*][b]SchedulerFactoryBean Java Doc:[/b][url]http://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/scheduling/quartz/SchedulerFactoryBean.html[/url]

[/list]

本次集成主要用到了Spring提供的

org.springframework.scheduling.quartz.SchedulerFactoryBean,该类使得Spring application context可以创建或管理Quartz的Scheduler,包括注册JobDetails、Calendars和Triggers等。

有了这个类,可以Retire掉org.quartz.ee.servlet.QuartzInitializerListener这个Listener。

[b][color=blue]注:这个类兼容Quartz 2.1.4及以上版本,Spring 4.1及以上版本。[/color][/b]

[b]1. 例子(使用Annotation):[/b]

quartz_jobs.xml:略

quartz.properties:略


import org.quartz.spi.TriggerFiredBundle;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
import org.springframework.scheduling.quartz.AdaptableJobFactory;
import org.springframework.stereotype.Component;
@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;
}
}

实现AdaptableJobFactory接口的JobFactory类,并重写createJobInstance方法。


import java.util.Properties;
import org.springframework.context.annotation.Bean;
import org.springframework.scheduling.quartz.SchedulerFactoryBean;
import org.springframework.stereotype.Component;
@Component
public class ComponentFactory {

@Bean
public SchedulerFactoryBean getSchedulerFactoryBean(JobFactory myJobFactory) throws Exception {
SchedulerFactoryBean bean = new SchedulerFactoryBean();
bean.setJobFactory(myJobFactory);
bean.setSchedulerName("myscheduler");
Properties quartzProperties = new Properties();
quartzProperties.load(this.getClass().getResourceAsStream("/quartz.properties"));
bean.setQuartzProperties(quartzProperties);
return bean;
}
}

定义bean: schedulerFactoryBean。


public class DumpJob implements Job {

@Autowired
private ServiceA serviceA;

public void execute(JobExecutionContext context) throws JobExecutionException {
assertNotNull("Service should be injected.", serviceA);
}
}

定义一个Job,注入一个Service进行Test。

[b]2. 源码分析:[/b]

先是SchedulerFactoryBean类:


public class SchedulerFactoryBean extends SchedulerAccessor implements FactoryBean<Scheduler>,
BeanNameAware, ApplicationContextAware, InitializingBean, DisposableBean, SmartLifecycle {

// Implementation of InitializingBean interface
@Override
public void afterPropertiesSet() throws Exception {
// 节选
// Create SchedulerFactory instance...
SchedulerFactory schedulerFactory = BeanUtils.instantiateClass(this.schedulerFactoryClass);
initSchedulerFactory(schedulerFactory);
}
}

首先看这个类的接口,实现了InitializingBean(该接口只定义了一个方法,叫afterPropertiesSet(),看源码知,SchedulerFactoryBean重写了afterPropertiesSet()方法,在里面做了很多事情,如:

a. 创建了SchedulerFactory

b. 创建Scheduler

c. 如果有jobFactory属性,那么set

d. 注册Scheduler、Job、Trigger的监听器listener(如果有定义的话)

e. 注册Job和Trigger

此外,我们对于Quartz Job的参数设定,也是通过SchedulerFactoryBean类来实现的,以下是该类的一些常用属性:

[list]

[*]public static final int DEFAULT_THREAD_COUNT = 10; 默认线程数为10。

[*]private String schedulerName; Scheduler的名字,若没有定义则默认用bean的名称(name)。

[*]private Resource configLocation; Quartz的配置如quartz.properties的存放位置,若是在xml中配置,则可以写成<property name=”configLocation” value=”classpath:quartz.properties”/>。

[*]private Properties quartzProperties; 若是使用Annotation来定义bean,那么初始化quartz.properties可以用bean.setQuartzProperties(Properties)。

[*]private JobFactory jobFactory; 注入一个JobFactory对象。

[/list]

介绍org.quartz.spi.JobFactory:


public interface JobFactory {
Job newJob(TriggerFiredBundle bundle, Scheduler scheduler) throws SchedulerException;
}

介绍:org.springframework.scheduling.quartz.AdaptableJobFactory:


public class AdaptableJobFactory implements JobFactory {
protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception {
return bundle.getJobDetail().getJobClass().newInstance();
}
}

若我们生成一个类实现AdaptableJobFactory,Job在实例化的时候都会调用AdaptableJobFactory#createJobInstance(),在上面的自定义MyJobFactory中重写了该方法:

a. 获得当前的jobInstance实例。

b. 利用AutowireCapableBeanFactory,将job实例设置为auto wired bean。

AutowireCapableBeanFactory是一个继承了BeanFactory的接口,虽然是BeanFacoty的子接口,但名气远没有ListableBeanFactory大(ApplicationContext的父接口)~ 这个类的主要功能就是将ApplicationContext之外的一些instance实例加入到Spring Application上下文中。如将JobInstance加入进来。

该类获取方式:org.springframework.context.ApplicationContext#getAutowireCapableBeanFactory()

这就是为什么我们可以直接在MyJobFacoty中使用该bean。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/142326.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • pycharm无法使用第三方库_python第三方库安装失败

    pycharm无法使用第三方库_python第三方库安装失败前言:在使用pycharm学习python的时候,经常需要第三方库,没有第三方库程序就会报错,pycharm也会提醒你要安装所需要的库,安装第三方库的时候往往就出现了问题,如图;下面我将谈谈一些我遇到的问题及解决经验。1.检查pip是否为最新版本pip不是最新版本时,会直接导致你安装第三方库失败。解决方法:第一,看是否直接在pycharm的setting里面Project下的Projec…

    2022年8月27日
    3
  • 键盘钩子入门

    键盘钩子入门1钩子   钩子是操作系统消息处理的一种机制。通过钩子,应用程序可以安装一个钩子回调过程让系统调用,从而监视系统中的消息队列。在这些消息到达目标窗口之前对这些消息进行处理。1.1钩子函数1)钩子函数会降低操作系统的性能,因为它增加系统处理每一个消息的开销。所以用户除非必须才要安装钩子,而且还要尽可能早地去除钩子。2)操作系统支持多种类型的钩子,每种类型都提供了它特有的消息处理机制。3)对…

    2022年4月28日
    150
  • 【转】Mac下升级python2.7到python3.6

    【转】Mac下升级python2.7到python3.6

    2022年3月7日
    38
  • vector 的六种 创建和初始化方法「建议收藏」

    vector 的六种 创建和初始化方法「建议收藏」C++的初始化方法很多,各种初始化方法有一些不同。(1):vector&lt;int&gt;ilist1;  默认初始化,vector为空,size为0,表明容器中没有元素,而且capacity也返回0,意味着还没有分配内存空间。这种初始化方式适用于元素个数未知,需要在程序中动态添加的情况。(2):vector&lt;int&gt;ilist2(ilist);vector&lt…

    2022年9月18日
    0
  • 【奇巧淫技】python 助你每天早上八点自动发送天气预报邮件到QQ邮箱「建议收藏」

    【奇巧淫技】python 助你每天早上八点自动发送天气预报邮件到QQ邮箱「建议收藏」将代码部署服务器,每日早上定时获取到天气数据,并发送到邮箱。也可以说是一个小人工智障。思路可以运用在不同地方,主要介绍的是思路。

    2022年6月28日
    97
  • 三种主流芯片架构简单比较[通俗易懂]

    三种主流芯片架构简单比较[通俗易懂]来源:https://blog.csdn.net/weixin_39752599/article/details/78664055可以参照的信息:https://blog.csdn.net/shenghuaDay/article/details/78747561三种主流芯片架构  1. ARM ARM是高级精简指令集的简称(AdvancedRISCMachine),它是一个32位的精简…

    2022年9月6日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号