Quartz spring定时器
### Quartz Spring 定时器详解 #### 一、引言 在现代软件开发中,定时任务是不可或缺的一部分,尤其在企业级应用中更是扮演着重要角色。Quartz 是一款开源的任务调度框架,它功能强大且灵活,能够满足复杂的业务需求。而Spring作为Java企业级应用的主流框架之一,其与Quartz的结合可以更好地实现定时任务的功能。 #### 二、Quartz与Spring集成概述 ##### 1. Quartz简介 Quartz是一款由OpenSymphony组织提供的开源作业调度框架,它提供了强大的触发机制用于定义作业何时运行,并且可以将作业绑定到Spring容器中的bean,这意味着开发者可以在作业执行过程中调用Spring管理的组件,实现高度解耦。 ##### 2. Spring集成Quartz的优势 - **统一管理**:通过Spring容器管理Quartz调度器的所有组成部分,简化了配置和管理。 - **依赖注入**:利用Spring的依赖注入特性,可以轻松地将Spring管理的bean注入到Quartz任务中。 - **事务支持**:Spring提供了一套完善的事务管理机制,可以很好地支持Quartz中的事务性任务。 #### 三、Quartz在Spring中的配置 ##### 1. 配置SchedulerFactoryBean 为了在Spring中使用Quartz,通常会配置一个`SchedulerFactoryBean`来创建和管理`Scheduler`实例。这个Bean可以通过属性注入的方式指定数据源、事务管理器等配置。 ```xml <bean id="scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <!-- 数据源 --> <property name="dataSource"> <ref bean="dataSource"/> </property> <property name="transactionManager" ref="txManager"> </property> <!-- 启动延迟30秒 --> <property name="startupDelay" value="30"></property> <property name="schedulerContextAsMap"> <map> <!-- 将Spring管理的服务注入到Scheduler上下文中 --> <entry key="jobService" value-ref="jobService"/> </map> </property> <!-- 将Spring上下文作为Scheduler上下文的键 --> <property name="applicationContextSchedulerContextKey"> <value>applicationContext</value> </property> </bean> ``` - **`dataSource`**:用于Quartz的持久化存储,如数据库。 - **`transactionManager`**:指定事务管理器,确保调度操作在事务范围内进行。 - **`startupDelay`**:启动时的延迟时间,默认为0秒,此处设置为30秒。 - **`schedulerContextAsMap`**:将Spring管理的服务注入到Scheduler上下文中。 - **`applicationContextSchedulerContextKey`**:指定Spring上下文作为Scheduler上下文的键。 ##### 2. 触发器和作业配置 除了基本的`SchedulerFactoryBean`配置外,还需要定义具体的作业(Job)和触发器(Trigger),并将其添加到`Scheduler`中。 ```xml <!-- 定义作业详情 --> <bean id="myJobDetail" class="org.springframework.scheduling.quartz.JobDetailFactoryBean"> <property name="jobClass" value="com.example.MyJob"/> <property name="group" value="MY_JOB_GROUP"/> </bean> <!-- 定义触发器 --> <bean id="myTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean"> <property name="repeatInterval" value="5000"/> <property name="jobDetail" ref="myJobDetail"/> </bean> <!-- 添加到Scheduler --> <bean id="scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <property name="triggers"> <list> <ref bean="myTrigger"/> </list> </property> </bean> ``` #### 四、示例代码解析 ##### 1. 示例代码 在给定的部分内容中,可以看到一个简单的`SchedulerFactoryBean`配置示例,其中包含了如何注入数据源、事务管理器、启动延迟、上下文映射等关键属性。 ##### 2. 数据源与事务管理 - **`dataSource`**:通过`<ref>`元素引用了名为`dataSource`的数据源Bean。 - **`transactionManager`**:同样通过`<ref>`引用了事务管理器Bean。 ##### 3. 上下文映射 - **`schedulerContextAsMap`**:通过`<entry>`元素将名为`jobService`的Bean映射到Scheduler上下文中,这使得在执行定时任务时可以直接访问到该服务。 #### 五、高级特性 ##### 1. 自动启动与延迟启动 - **`autoStartup`**:控制`SchedulerFactoryBean`是否自动启动。 - **`startupDelay`**:设置启动延迟时间,单位为秒。 ##### 2. 复杂触发器配置 - **`triggers`**:可以通过`<list>`元素定义多个触发器。 - **`calendars`**:使用`<map>`定义日历规则。 ##### 3. 附加属性 - **`nonTransactionalDataSource`**:用于非事务性的数据源配置。 - **`quartzProperties`**:允许自定义Quartz的配置属性。 #### 六、总结 通过Spring和Quartz的结合,不仅可以实现强大的定时任务管理,还能充分利用Spring的依赖注入和事务管理能力,极大地提高了开发效率和系统稳定性。在实际项目中,可以根据具体需求灵活配置这些选项,实现高效稳定的定时任务解决方案。
Quartz 是开源任务调度框架中的翘首,它提供了强大任务调度机制,同时保持了使用的简单性。Quartz 允许开发人员灵活地定义触发器的调度时间表,并可以对触发器和任务进行关联映射。此外,Quartz提供了调度运行环境的持久化机制,可以保存并恢复调度现场,即使系统因故障关闭,任务调度现场数据并不会丢失。此外,Quartz还提供了组件式的侦听器、各种插件、线程池等功能。
Spring为创建Quartz的Scheduler、Trigger和JobDetail提供了便利的FactoryBean类,以便能够在Spring 容器中享受注入的好处。此外Spring还提供了一些便利工具类直接将Spring中的Bean包装成合法的任务。Spring进一步降低了使用Quartz的难度,能以更具Spring风格的方式使用Quartz。概括来说它提供了两方面的支持:
1)为Quartz的重要组件类提供更具Bean风格的扩展类;
2)提供创建Scheduler的BeanFactory类,方便在Spring环境下创建对应的组件对象,并结合Spring容器生命周期进行启动和停止的动作。
第一步: 配置SchedulerFactoryBean
Quartz的SchedulerFactory是标准的工厂类,不太适合在Spring环境下使用。此外,为了保证Scheduler能够感知Spring容器的生命周期,完成自动启动和关闭的操作,必须让Scheduler和Spring容器的生命周期相关联。以便在Spring容器启动后,Scheduler自动开始工作,而在Spring容器关闭前,自动关闭Scheduler。为此,Spring提供SchedulerFactoryBean,这个FactoryBean大致拥有以下的功能:
1)以更具Bean风格的方式为Scheduler提供配置信息;
2)让Scheduler和Spring容器的生命周期建立关联,相生相息;
3)通过属性配置部分或全部代替Quartz自身的配置文件。
spring容器中的bean只能放到SchedulerContext里面传入job中。
Java代码
<bean name="scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean" >
<!-- 注入数据源 -->
<property name="dataSource">
<ref bean="dataSource" />
</property>
<property name="transactionManager" ref="txManager">
</property>
<!-- 延迟30秒启动Scheduler -->
<property name="startupDelay" value="30"></property>
<property name="schedulerContextAsMap">
<map>
<!-- spring 管理的service需要放到这里,才能够注入成功 -->
<description>schedulerContextAsMap</description>
- mozhipaidui2012-12-14很不错的资源,对于Quartz和spring的整合处理很有帮助,谢谢朋友的分享
- 粉丝: 109
- 资源: 8
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助