`
angelbill3
  • 浏览: 256912 次
  • 性别: Icon_minigender_2
  • 来自: 杭州
社区版块
存档分类
最新评论

使用SchedulerFactoryBean集成Quarz Job与Spring

 
阅读更多
本文介绍Quartz Job与Spring的集成。


本次集成主要用到了Spring提供的
org.springframework.scheduling.quartz.SchedulerFactoryBean,该类使得Spring application context可以创建或管理Quartz的Scheduler,包括注册JobDetails、Calendars和Triggers等。
有了这个类,可以Retire掉org.quartz.ee.servlet.QuartzInitializerListener这个Listener。

注:这个类兼容Quartz 2.1.4及以上版本,Spring 4.1及以上版本。


1. 例子(使用Annotation):
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。


2. 源码分析:
先是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类来实现的,以下是该类的一些常用属性:
  • 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对象。


介绍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。
分享到:
评论

相关推荐

    使用spring自带quarz实现定时处理

    Spring框架是Java开发中广泛应用的一个开源工具,它提供了丰富的功能,包括依赖注入、AOP(面向切面编程)、...通过Spring与Quartz的结合,我们可以方便地在Spring应用中管理和执行定时任务,提高系统的自动化程度。

    Spring4集成quartz2.2.1

    总结,Spring 4集成Quartz 2.2.1涉及的主要步骤包括:引入Quartz依赖、配置SchedulerFactoryBean、定义Job类、创建Trigger以及打包应用。这个过程使得我们可以灵活地在Spring应用中管理和执行定时任务。

    spring和quartz的定时器的启动和停止例子

    Spring提供了一种集成Quartz的方式,使得我们可以方便地在Spring应用中管理和执行定时任务。本篇将深入探讨如何在Spring中启动和停止Quartz定时器。 首先,我们需要理解Spring和Quartz的基本概念。Spring是一个强大...

    spring4 + quarz2 集群

    4. 创建Scheduler:使用Spring的`org.springframework.scheduling.quartz.SchedulerFactoryBean`来实例化Quartz的Scheduler,这一步会将Job和Trigger关联起来。 5. 集群配置:为了实现Quartz2的集群,需要配置`org....

    Spring整合Quartz定时任务实例

    当Spring与Quartz结合时,可以利用Spring的强大功能来管理和配置Quartz作业,使定时任务的管理变得更加简单和高效。 在Spring 4.2.1.RELEASE版本中,整合Quartz的过程主要涉及以下几个步骤: 1. **添加依赖**:...

    Quarz相关资料.zip

    6. **Quartz与Spring的集成** - 使用Spring的`QuartzJobBean`简化Job的编写,自动注入依赖。 - 在Spring配置文件中声明SchedulerFactoryBean,配置Quartz。 - 通过`@DisallowConcurrentExecution`和`@...

    Spring 4.2 集成 Quartz2 任务调度示例

    在本文中,我们将深入探讨如何在Spring 4.2.2框架中集成Quartz 2.2.2,实现高效的任务调度。Quartz是一个开源的作业调度框架,它允许开发者安排任务以按照预设的时间间隔运行。而Spring框架是Java企业级应用开发的...

    quarz分布式定时任务

    ### Spring与Quartz集成 Spring框架提供了对Quartz的支持,简化了其配置和使用过程。通过Spring的配置文件可以方便地定义作业、触发器等组件。下面给出一个示例配置片段: ```xml &lt;!-- 定义作业类 --&gt; &lt;!--...

    spring 调度实例

    3. **配置Spring与Quartz** 在Spring配置文件中,配置Quartz的SchedulerFactoryBean,并指定配置文件: ```xml &lt;bean id="scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"&gt; ...

    quartz.zip定时任务

    Spring提供了一种方便的方式来声明Job和Trigger,通过`&lt;bean&gt;`标签定义它们,然后使用`&lt;bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean"&gt;`来启动Quartz Scheduler。 在Spring中,你可以...

    quartz demo

    2. **Spring与Quartz的整合** - 在Spring中整合Quartz,首先需要在项目中引入Quartz和Spring的相应依赖。 - 配置Spring的ApplicationContext,声明SchedulerFactoryBean,这是启动和管理Quartz Scheduler的主要...

    ssm框架+quartz2.2Jar包

    1. **配置Spring**:在Spring的配置文件中添加Quartz的配置,包括SchedulerFactoryBean,JobDetail和Trigger,以便于Spring管理Quartz的实例。 2. **定义Job类**:创建实现`org.quartz.Job`接口的类,定义实际要...

Global site tag (gtag.js) - Google Analytics