使用SchedulerFactoryBean集成Quarz Job与Spring

本文介绍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。
Quartz(二)整合Spring容器中bean及动态调度任务 NULL 博文链接:https://mengqingyu.iteye.com/blog/568935 立即下载

相关推荐

ThinkPHP+Layui开发的ERP管理系统

ERP采购生产销售系统,一款基于ThinkPHP+Layui开发的ERP管理系统,帮助中小企业实现ERP管理规范化,此系统能为你解决五大方面的经营问题:1.采购管理 2.销售管理 3.仓库管理 4.资金管理 5.生产管理,适用于:服装鞋帽、化妆品、机械机电、家具装潢、建材行业、快销品、母婴用品、办公用品、汽配汽修、生鲜农贸、手机通讯、数码家电、医药用品、制造业、信息技术服务行业等。提供全部无加密服务端和前端源代码,独立部署,不受限制。

u011092458的博客 788

Quartz任务中调用Spring容器中bean及动态调度任务

[size=medium]Quartz 是开源任务调度框架中的翘首,它提供了强大任务调度机制,同时保持了使用的简单性。Quartz 允许开发人员灵活地定义触发器的调度时间表,并可以对触发器和任务进行关联映射。此外,Quartz提供了调度运行环境的持久化机制,可以保存并恢复调度现场,即使系统因故障关闭,任务调度现场数据并不会丢失。此外,Quartz还提供了组件式的侦听器、各种插件、线程池等功能。 ...

John_Kong19的专栏 1232

门控时钟(clock gating)的DFT设计

在数字IC芯片中,时钟树的功耗占比可能高达30%,因此一般会采取门控时钟的方式来降低该部分的功耗。所谓门控时钟,就是在芯片实际工作过程中,有些信号或者功能并不需要一直开启,那么就可以在它们不用的时候将其时钟信号关闭。这样一来信号不再翻转,从而能够有效减少动态功耗。 目前门控时钟都采用集成门控时钟单元(ICG,integrated clock gating cell),其结构如下。由一个latch和一个与门(也有的是或门)组成,可以过滤掉EN信号中的毛刺。一般的工艺库中都会有专门的ICG以供调用。 插入IC

weixin_44746697的博客 3872

Springboot整合Quartz定时任务框架(Spring解决方案)

spring提供的quartz解决发难

Ricardo.M.Yu的博客 4837

【社区分享】从零开始学习 TinyML,建立 TensorFlow 深度学习模型(技术优化篇)

本文来自社区投稿与征集,作者王玉成,ML&IoT Google Developers Expert,温州大学智能锁具研究院总工程师。 了解更多:https://blog.youkuaiyun.com/wfing 经过前面几章的讨论,我们了解了TinyML 的概念,完成了一个最简单的TinyML 的模型并且运行在微控制器上,得出最基本的结果。但是在实际的工程应用中,模型建立之后,也需要再进一步结合许多优化方面的技术,这就是我们接下来想要探讨的。 5. 优化 TinyML 这本书也详细的向我...

tensorflowforum的博客 1万+

从零开始:用Neo4j构建你的第一个知识图谱(附完整代码示例)

本文提供了一份从零开始的Neo4j知识图谱构建实战指南。通过一个“经典科幻电影宇宙”的具体案例,手把手教你安装环境、设计图谱模式,并使用Cypher查询语言完成节点与关系的创建、数据查询及可视化,帮助你快速掌握自下而上构建知识图谱的核心技能。

weixin_29053073的博客 471

SpringBoot-21-异步&定时任务

异步任务&定时任务   异步任务   异步任务知识介绍 在多线程时,后台执行多个任务,我们需要同步等待。此时前台不会给出任何响应,可以采用多线程 的方式解决这个问题。 SpringBoot采用异步注解的方式来解决这个问题,让我们在同步等待的时候,响应前台页面,无需 等待,后台代码执行依旧 实现异步任务        在SpringBoot实现异步任务很简单,在同步等待的任务中添加@Async注解,然后在SpringBoot添加@EnableAsync 代码实现 在com.liang.se

paiidds的博客 3750

基于Simulink进行步进电机的重复控制仿真建模

重复控制概述目的:通过引入一个周期延迟环节来补偿系统的周期性误差,从而提高系统对周期性参考信号或扰动的跟踪性能。方法内部模型原理:在控制器中嵌入一个与周期性信号相关的模型(例如周期延迟环节),以实现对周期性误差的零稳态误差控制。滤波器设计:为了避免高频噪声放大,通常会在重复控制器中加入低通滤波器。优势对周期性信号具有良好的跟踪性能。不需要精确的数学模型即可实现高性能控制。挑战:需要合理设计重复控制器的参数以避免系统不稳定。

amy_mhd的博客 266

Quartz与Spring集成—— SchedulerFactoryBean的初始化分析

Quartz是一个开源的定时调度框架,支持集群部署。我们可以通过其Java API来使用它,或者通过Spring来配置与管理,也可以结合使用两种方式。本文重点分析Quartz与Spring集成时的初始化过程。

beliefer的博客 7万+

【DRAM存储器五十一】LPDDR5介绍--DFE与Pre-Emphasis

简述LPDDR5的DFE和预加重应用设置

highman110的博客 703

【微服务】SpringBoot 整合 FastExcel 实现导入导出操作详解

SpringBoot 整合 FastExcel 实现导入导出操作详解

congge 4232

使用SchedulerFactoryBean的方式在xml中配置定时任务

2、类的全路径:org.springframework.scheduling.quartz.SchedulerFactoryBean。一、SchedulerFactoryBean来源。1、spring框架。

m0_47703468的博客 1297

SQL Server数据库备份与恢复

在 SQL Server 中,数据库备份与恢复是保障数据安全的核心操作。

zjw541806的博客 1876

spring结合quarz

spring结合quarz   Quartz任务中调用Spring容器中bean及动态调度任务 博客分类: QuartzSpringJAVA综合 springquartzSchedulerFactoryBean动态调度任务 Quartz 是开源任务调度框架中的翘首,它提供了强大任务调度机制,同时保持了使用的简单性。Quartz 允许开发人员灵活地定义触发器的调度时间表,并可以

ccecwg的专栏 711

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Spring与Quartz使用说明 job不同步执行(第一个job完成后才开始第二个job)

转自:http://blog.sina.com.cn/s/blog_675e9aeb0100qghp.html 最 近因为项目后台需要使用一个线程去定时跑一些任务,所以看了一下Spring和Quartz的使用与集成。例如发短信、邮件。根据实际使用,此集成使用比 自己去写线程方便和灵活,可以不用代码实现复杂的计划任务,如“1月份的每周三、周五的早上9点至10点每5钟一次任务”。所以分享一...

weixin_30527323的博客 353

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

spring quarz job配置详解

web.xml配置:   org.springframework.web.context.ContextLoaderListener     contextConfigLocation   WEB-INF/remoting-servlet.xml,WEB-INF/applicationContext.xml       Spring 配置文件:      

XiaoTanTongXie的专栏 759

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Spring和Quarz集成,实现定时任务

Spring和Quarz集成实现定时任务,是非常简单的一件事情。 因为实现其有各种各样的方法,这里介绍一个相对简单的方法。只需要简答的几部就可以实现: Step1: 导入Spring 和Quartz相关的jar包,使用maven或直接下载下来,放入lib目录下均可; Step2: 写一个定时任务的配置文件,如: app-quarz-spring.xml Step3: 在这个配置文件中,配置

Charles的博客 678

Spring+Quartz实现定时任务

在我们进行软件项目开发的过程中,相信大家在很多时候都会遇到如下业务场景:每天、每周或每月生成相应的业务报表;每天统计系统注册人数;定期清理平台长久不登录的用户等等。遇到这种业务场景需要怎样去处理?人为定时去数据库操作来统计?别开玩笑了,这种事情哪用得着人来做,如果像这种任务还需要专人每天都去做统计,那估计很多人就要疯掉了。针对于这种业务情况,采用定时任务是个非常不错的选择。在Java领域中,定时任

二当家的 4万+

quarz定时任务中无法注入bean的解决办法

最近在学习quarz,在整合Spring过程中遇到了在job的实现类中通过@aurowrie注入service无效的问题,经过在网上查找了一些方法并且亲测有效后,整理代码如下,纪念一下自己的学习过程。   1、写一个自定义类(CustomJobFactory),继承SpringBeanJobFactory package com.qf.shopping.task; import org.q...

404NottFound 788

Quartz与Spring的整合-Quartz中的job如何自动注入spring容器托管的对象

问题 Quartz中的job是由Quartz框架动态创建的(配置该job的classname,通过反射创建),而job一般会依赖到配置在spring中的bean,怎样获取或者更好的自动注入这些依赖bean呢? 预期效果 我们希望达到这样的效果: /** * * 取消超时未支付订单的任务。 * * @author arganzheng */ public class

qq_22884121的博客 434

Quartz入门使用

Quartz是一个功能丰富的开源作业调度库,可以集成到几乎任何Java应用程序中——从最小的独立应用程序到最大的电子商务系统。Quartz可用于创建简单或复杂的调度,以执行数十个、数百个甚至数万个作业;这些作业的任务被定义为标准Java组件,这些组件实际上可以执行您编程让它们执行的任何事情。Quartz Scheduler包括许多企业级特性,比如支持JTA事务和集群。 1、Quarz 入门 ...

bearboy80的专栏 1465

Spring中如何使用Quartz

背景: 接着上一篇文章,项目当中有个需求需要定时去检测工单的状态,这时我就想到了使用quartz来做一个任务调度系统。本篇文章就是给大家介绍如何在spring中加入quartz。 spring集成Quartz: 首先第一步肯定是在pom文件中导入相关的包。pom.xml: &lt;dependency&gt; &lt;groupId&gt;org.apache.loggin...

我是你妹她哥的博客 4437

spring定时器配置

目录 搭建好spring环境 导入quartz-all-2.1.5.jar 定时器beans-quarz-packet.xml配置 web.xml引入beans-quarz-packet.xml 编写定时器类TimeTask 测试,重启服务,监测控制台 搭建好spring环境 导入quartz-all-2.1.5.jar 定时器beans-quarz-packet.xml配置...

qq_29988051的博客 383

在Spring中使用Quartz进行任务调度

[size=medium]在Spring中使用Quartz进行任务调度 概述 各种企业应用几乎都会碰到任务调度的需求,就拿论坛来说:每隔半个小时生成精华文章的RSS文件,每天凌晨统计论坛用户的积分排名,每隔30分钟执行锁定用户解锁任务。对于一个典型的MIS系统来说,在每月1号凌晨统计上个月各部门的业务数据生成月报表,每半个小时查询用户是否已经有快到期的待处理业务…… ...

shine1200的专栏 202

quarz定时任务

quarz定时

qq_40398994的博客 412

spring的Quartz配置

概念: 1、Job 表示一个工作,要执行的具体内容。此接口中只有一个方法 void execute(JobExecutionContext context)2、JobDetail JobDetail表示一个具体的可执行的调度程序,Job是这个可执行程调度程序所要执行的内容,另外JobDetail还包含了这个任务调度的方案和策略。3、Trigger代表一个调度参数的配置,什么时候去调。4、Sc

pengjwhx的博客 261
上一篇: SpringBeanAutowiringSupport介绍
下一篇: 结合源码谈谈Servlet的实例化、变量以及多线程
angelbill3
博客等级 码龄18年 3粉丝 83原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值