Spring框架对QUARTZ任务调度组件的扩展支持实践小结

简介:

Quartz 是优秀的开源的任务调度框架,它提供了强大任务调度机制。Quartz允许开发人员定义触发器的调度时间表,并提供了触发器和任务之间的关联映射。此外,Quartz提供了调度运行环境的持久化机制,可以保存并恢复调度现场,即使系统因故障关闭,任务调度现场数据并不会丢失。此外,Quartz还提供了组件式的侦听器、各种插件、线程池等功能。

Spring 为创建QuartzSchedulerTriggerJobDetail提供了便利的FactoryBean类,以便能够在Spring 容器中享受注入的好处,主要有以下两个方面:
    1)
Quartz的重要组件类提供更具Bean风格的扩展类;  
    2)
提供创建SchedulerBeanFactory类,方便在Spring环境下创建对应的组件对象,并结合Spring容器生命周期进行启动和停止的动作。
JobDetailBean
关于JobDetail Spring通过扩展JobDetail提供了一个JobDetailBean(org.springframework.scheduling.quartz包里)JobDetailBean可以配置以下属性,其任务类如果实现了org.quartz.Job,则jobDataAsMap的值的修改无法保留到下一次执行,如果实现了org.quartz.StatefulJob
● jobClass:类型为Class,实现Job/StatefulJob接口的任务类;  
    ● beanName
:默认为Beanid名,通过该属性显式指定Bean名称,它对应任务的名称;
 
    ● jobDataAsMap
:类型为Map,为任务所对应的JobDataMap提供值。Spring通过jobDataAsMap设置JobDataMap的值;
 
    ● applicationContextJobDataKey
:你可以将Spring ApplicationContext的引用保存到JobDataMap中,以便在Job的代码中访  ApplicationContext。为了达到这个目的,你需要指定一个键,用以在jobDataAsMap中保存ApplicationContext,如果不设置此键,JobDetailBean就不将ApplicationContext放入到JobDataMap中。
 
    ● jobListenerNames
:类型为String[],指定注册在Scheduler中的JobListeners名称,以便让这些监听器对本任务的事件进行监听。
***此外,Spring提供了一个MethodInvokingJobDetailFactoryBean,通过这个FactoryBean可以将Spring容器中Bean的方法包装成Quartz任务,这样开发者就不必为Job创建对应的类。否则该类只是简单包含调用Bean的方法,并无实际使用价值。这个FactoryBean的配置实例如下(假设封装businessBeanschedulerMethod方法,以有状态Job调度,即其中的JobDataMap将得到维持,concurrent默认为true,即无状态Job调度)
<bean id="methodJobSmp" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
    <property name="targetObject" ref="businessBean" />
    <property name="targetMethod" value="schedulerMethod" />
    <property name="concurrent" value="false" />
  </bean>
注意:其中的schedulerMethod方法即可以是static,也可以是非static的,但不能拥有方法入参。通过MethodInvokingJobDetailFactoryBean产生的JobDetail不能被序列化,所以不能被持久化到数据库中的,如果希望使用持久化任务,则你只能创建正规的QuartzJob实现类了。
有了JobDetail作为具体任务,我们还需要Spring帮我们调度到调度器里去生效。Spring可以配置三种调度,其中简单调度SimpleTriggerBean,定时调度CronTriggerBean是为Quartz扩展(org.springframework.scheduling.quartz包里),还自己提供了计时调度ScheduledTimerTaskorg.springframework.scheduling.timer里)。
SimpleTriggerBean配置实例如下(任务为jobDetailBeanName,是一个JobDetailBeanid,可是是具体实现类,也可以是MethodInvokingJobDetailFactoryBean配置的代理类;延迟10秒后启动,时间间隔为20秒,重复执行100次,配置任务变量count值为10)
<bean id="simpleTrigger1" class="org.springframework.scheduling.quartz.SimpleTriggerBean">
<property name="jobDetail" ref="jobDetailBeanName" />
<property name="startDelay" value="1000" />
<property name="repeatInterval" value="2000" />
<property name="repeatCount" value="100" />
<property name="jobDataAsMap">
<map>
<entry key="count" value="10" />
</map>
</property>
</bean>
 
CronTriggerBean配置实例如下(任务为jobDetailBeanName,调度时间表是每天每隔三小时运行(0点,3点,6,…
<bean id="cronTriggerSmp" class="org.springframework.scheduling.quartz.CronTriggerBean">
         <property name="jobDetail" ref="jobDetailBeanName"/>
         <property name="cronExpression" value="0 0 */3 * * ? *"/>
  </bean>
cronExpression的表示式规范:
域名
强制?
允许值范围
支持的特殊字符
0-59
- * /
0-59
- * /
0-23
- * /
1-31
- * / ? L W C
1-12
- * /
星期
1-7 SUN-SAT
- * / ? L C #
非空
1970-2099
- * /
 
计时调度ScheduledTimerTask配置实例如下(任务为jobDetailBeanName,执行间歇间隔为60秒,执行间隔为3600000毫秒)
<bean id="timerTaskExample" class="org.springframework.scheduling.timer.ScheduledTimerTask">
    <property name="delay" value="60"/>
    <property name="period" value="3600000"/>
    <property name="timerTask" ref="jobDetailBeanName"/>
  </bean>
 
有了调度项,我们可以把他们简单添加到调度器里去即可。Spring为计时调度ScheduledTimerTask提供了调度器工厂BEAN--TimerFactoryBeanorg.springframework.scheduling.timer包里),该调度器配置实例如下:
<bean id="timeSample" class="org.springframework.scheduling.timer.TimerFactoryBean">
    <property name="scheduledTimerTasks">
      <list>
        <ref bean=" timerTaskExample "/><!—可以很多 -->
      </list>
    </property>
  </bean>
 
Sprint还为扩展Quartz的调度CronTriggerBeanSimpleTriggerBean也扩展了调度器工厂BEAN—SchedulerFactoryBeanorg.springframework.scheduling.quartz包里),其配置实例如下:
<bean id="scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
     <property name="autoStartup"><!-初始化后是否马上启动Scheduler,默认true. -->
            <value>true</value>
        </property>
<property name="startupDelay"><!-初始化后是否延时多少秒启动Scheduler,默认0马上启动,通过startupDelay属性让Scheduler延迟一小段时间后启动,以便让Spring能够更快初始化容器中剩余的Bean. -->
            <value>0</value>
        </property>
         <property name="triggers">
                <list>
                       <ref local="simpleTrigger1"/>             
                       <ref local="cronTriggerSmp "/>          
                       <ref local="quartzTrigger1"/>             
                </list>
         </property>
<property name="schedulerContextAsMap"> <!—context setting -->
    <map>
        <entry key="keya" value="valuea"/>
    </map>
</property>
<property name="configLocation" value="classpath:com/coma/projb/quartz/quartz.properties" />
  </bean>
  还有calendars属性(类型为Map,通过该属性向Scheduler注册Calendar),jobDetails属性(类型为JobDetail[],通过该属性向Scheduler注册JobDetail)用得不多。
SchedulerFactoryBean还可以通过以下属性代替框架的自身配置文件:  
    ● dataSource
:当需要使用数据库来持久化任务调度数据时,你可以在Quartz中配置数据源,也可以直接在Spring中通过dataSource指定一个Spring管理的数据源。如果指定了该属性,即使quartz.properties中已经定义了数据源,也会被此dataSource覆盖;
 
    ● transactionManager
:可以通过该属性设置一个Spring事务管理器。在设置dataSource时,Spring强烈推荐你使用一个事务管理器,否则数据表锁定可能不能正常工作;
 
    ● nonTransactionalDataSource
:在全局事务的情况下,如果你不希望Scheduler执行化数据操作参与到全局事务中,则可以通过该属性指定数据源。在Spring本地事务的情况下,使用dataSource属性就足够了;
 
    ● quartzProperties
:类型为Properties,允许你在Spring中定义Quartz的属性。其值将覆盖quartz.properties配置文件中的设置,这些属性必须是Quartz能够识别的合法属性,配置quartzProperties属性实例如下:
bean id="scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="quartzProperties">
<props>
<prop key="org.quartz.threadPool.class">org.quartz.simpl.SimpleThreadPool</prop>
<prop key="org.quartz.threadPool.threadCount">10</prop>
</props>
</property>
</bean>

本文转自 dannyy1026 51CTO博客,原文链接:http://blog.51cto.com/dannyyuan/200775

相关文章
|
4月前
|
存储 人工智能 Java
AI 超级智能体全栈项目阶段四:学术分析 AI 项目 RAG 落地指南:基于 Spring AI 的本地与阿里云知识库实践
本文介绍RAG(检索增强生成)技术,结合Spring AI与本地及云知识库实现学术分析AI应用,利用阿里云Qwen-Plus模型提升回答准确性与可信度。
1565 90
AI 超级智能体全栈项目阶段四:学术分析 AI 项目 RAG 落地指南:基于 Spring AI 的本地与阿里云知识库实践
|
5月前
|
安全 Java Ruby
我尝试了所有后端框架 — — 这就是为什么只有 Spring Boot 幸存下来
作者回顾后端开发历程,指出多数框架在生产环境中难堪重负。相比之下,Spring Boot凭借内置安全、稳定扩展、完善生态和企业级支持,成为构建高可用系统的首选,真正经受住了时间与规模的考验。
410 2
|
4月前
|
安全 前端开发 Java
《深入理解Spring》:现代Java开发的核心框架
Spring自2003年诞生以来,已成为Java企业级开发的基石,凭借IoC、AOP、声明式编程等核心特性,极大简化了开发复杂度。本系列将深入解析Spring框架核心原理及Spring Boot、Cloud、Security等生态组件,助力开发者构建高效、可扩展的应用体系。(238字)
|
6月前
|
XML JSON Java
Spring框架中常见注解的使用规则与最佳实践
本文介绍了Spring框架中常见注解的使用规则与最佳实践,重点对比了URL参数与表单参数的区别,并详细说明了@RequestParam、@PathVariable、@RequestBody等注解的应用场景。同时通过表格和案例分析,帮助开发者正确选择参数绑定方式,避免常见误区,提升代码的可读性与安全性。
|
6月前
|
前端开发 Java API
利用 Spring WebFlux 技术打造高效非阻塞 API 的完整开发方案与实践技巧
本文介绍了如何使用Spring WebFlux构建高效、可扩展的非阻塞API,涵盖响应式编程核心概念、技术方案设计及具体实现示例,适用于高并发场景下的API开发。
518 0
|
4月前
|
消息中间件 缓存 Java
Spring框架优化:提高Java应用的性能与适应性
以上方法均旨在综合考虑Java Spring 应该程序设计原则, 数据库交互, 编码实践和系统架构布局等多角度因素, 旨在达到高效稳定运转目标同时也易于未来扩展.
264 8
|
4月前
|
人工智能 监控 Java
Spring AI Alibaba实践|后台定时Agent
基于Spring AI Alibaba框架,可构建自主运行的AI Agent,突破传统Chat模式限制,支持定时任务、事件响应与人工协同,实现数据采集、分析到决策的自动化闭环,提升企业智能化效率。
Spring AI Alibaba实践|后台定时Agent
|
5月前
|
监控 Kubernetes Cloud Native
Spring Batch 批处理框架技术详解与实践指南
本文档全面介绍 Spring Batch 批处理框架的核心架构、关键组件和实际应用场景。作为 Spring 生态系统中专门处理大规模数据批处理的框架,Spring Batch 为企业级批处理作业提供了可靠的解决方案。本文将深入探讨其作业流程、组件模型、错误处理机制、性能优化策略以及与现代云原生环境的集成方式,帮助开发者构建高效、稳定的批处理系统。
618 1
|
6月前
|
Java 应用服务中间件 开发者
Spring Boot 技术详解与应用实践
本文档旨在全面介绍 Spring Boot 这一广泛应用于现代企业级应用开发的框架。内容将涵盖 Spring Boot 的核心概念、核心特性、项目自动生成与结构解析、基础功能实现(如 RESTful API、数据访问)、配置管理以及最终的构建与部署。通过本文档,读者将能够理解 Spring Boot 如何简化 Spring 应用的初始搭建和开发过程,并掌握其基本使用方法。
496 2
|
7月前
|
安全 Java 微服务
Java 最新技术和框架实操:涵盖 JDK 21 新特性与 Spring Security 6.x 安全框架搭建
本文系统整理了Java最新技术与主流框架实操内容,涵盖Java 17+新特性(如模式匹配、文本块、记录类)、Spring Boot 3微服务开发、响应式编程(WebFlux)、容器化部署(Docker+K8s)、测试与CI/CD实践,附完整代码示例和学习资源推荐,助你构建现代Java全栈开发能力。
810 1