Spring整合Quartz实现定时任务的两种方法解析
"本文将介绍如何在Spring框架中结合Quartz库实现定时任务的两种方法。这两种方法均基于Spring的`org.springframework.scheduling.quartz`包,以方便地与Quartz进行集成,实现灵活的定时调度。" 在Spring中集成Quartz进行定时任务管理时,有两种常见的方法: 1. 使用`MethodInvokingJobDetailFactoryBean` 这是第一种方法,通过Spring的`MethodInvokingJobDetailFactoryBean`,可以直接调用指定对象的特定方法作为定时任务。下面是一个配置示例: ```xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"> <!-- 1. 定义业务工作类 --> <bean id="businessWork" class="com.morningstar.quartz.BusinessWork"/> <!-- 2. 创建MethodInvokingJobDetailFactoryBean实例,指定目标业务对象和方法 --> <bean id="businessTask" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> <!-- 指定目标对象 --> <property name="targetObject" ref="businessWork"/> <!-- 指定执行的方法 --> <property name="targetMethod" value="generateReport"/> <!-- 设置并发执行为false,确保同一时间只有一个实例运行 --> <property name="concurrent" value="false"/> </bean> <!-- 3. 配置触发器,例如使用Cron表达式定时触发 --> <bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean"> <!-- 连接jobDetail --> <property name="jobDetail" ref="businessTask"/> <!-- 定义Cron表达式,如每5小时执行一次 --> <property name="cronExpression" value="0 0 5 * * ?"/> </bean> <!-- 4. 添加SchedulerFactoryBean来启动Quartz Scheduler --> <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <!-- 注册触发器 --> <property name="triggers"> <list> <ref bean="cronTrigger"/> </list> </property> </bean> </beans> ``` 在这个例子中,`BusinessWork`是包含业务逻辑的类,`generateReport`是该类中的一个方法,`MethodInvokingJobDetailFactoryBean`会定时调用这个方法。`CronTriggerBean`则定义了触发任务的时机,`cronExpression`属性用于设置Cron表达式,这里设置为每5小时执行一次。 2. 使用`JobDetail`和`Trigger` 第二种方法是直接创建`JobDetail`和`Trigger`实例,这种方式更加灵活,可以自定义更多的属性。首先定义一个实现了`org.quartz.Job`接口的类,然后创建对应的`JobDetail`和`Trigger`,并注册到`Scheduler`。这种方法虽然更底层,但需要更多的配置代码。 无论哪种方式,Spring都提供了方便的方式来与Quartz集成,使得我们可以轻松地在应用中添加定时任务,并通过Cron表达式或其他触发策略来控制任务的执行时机。这种灵活性使得开发者可以根据项目需求来定制定时任务的执行逻辑和调度策略。
[html]
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
<!--
方法一:
Spring 的org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean类,
使用此方法使开发人员对Quartz完全透明,需要实现定时任务的方法只是一个普通方法。
-->
<!--1、 配置文件中添加业务类,该类为调用的工作类 -->
<bean id="businessWork" class="com.morningstar.quartz.BusinessWork" />
<!-- 2、定义任务,在spring文件中配置代理类 ,定义调用对象和调用对象的方法-->
<bean id="businessTask" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<!-- 调用的类 -->
<property name="targetObject" ref="businessWork"/>
<!-- 调用类中的方法 -->
<property name="targetMethod" value="generateReport"/>
<!-- false,证明不执行并发任务 -->
<property name="concurrent" value="false"/>
</bean>
<!-- 3、配置触发器,定义触发时间,可以根据不同的时间对同一个任务定义多个触发器,下面是每隔5秒调用一个方法配置-->
<!-- cron表达式 -->
<bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail" ref="businessTask"/>
<property name="cronExpression" value="10,15,20,25,30,35,40,45,50,55 * * * * ?"/>
</bean>
<!-- 总管理类,如果lazy-init='false',则容器启动时就会执行调度程序-->
<!-- 如果lazy-init='true',则需要实例化该bean才能执行调度程序 -->
<bean id="schdulerFactory" lazy-init="false" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="cronTrigger"/>
</list>
</property>
</bean>
</beans>
2、借助于Spring的org.springframework.scheduling.quartz.JobDetailBean的类功能, 继承 Spring封装Quartz的org.springframework.scheduling.quartz.QuartzJobBean类,实现 executeInternal方法,executeInternal方法中调用业务类。
[html]
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
<!--
方法二:
借助于Spring的org.springframework.scheduling.quartz.JobDetailBean的类功能,
继承 Spring封装Quartz的org.springframework.scheduling.quartz.QuartzJobBean类,实现 executeInternal方法,
executeInternal方法中调用业务类
-->
<!-- 1、定义任务,在spring文件中配置代理类 ,定义调用对象和调用对象的方法-->
<bean id="businessTask" class="org.springframework.scheduling.quartz.JobDetailBean">
<!-- 调用的类 -->
<property name="jobClass" value="com.morningstar.quartz.BusinessWork"/>
<!-- 主要是为了在定时任务需要使用到Bean,通过Spring给注入进来,如果不写明,就会报java.lang.NullPointerException错误 -->
<!--
<property name="jobDataAsMap">
剩余7页未读,继续阅读
- 粉丝: 0
- 资源: 2
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 李兴华Java基础教程:从入门到精通
- U盘与硬盘启动安装教程:从菜鸟到专家
- C++面试宝典:动态内存管理与继承解析
- C++ STL源码深度解析:专家级剖析与关键技术
- C/C++调用DOS命令实战指南
- 神经网络补偿的多传感器航迹融合技术
- GIS中的大地坐标系与椭球体解析
- 海思Hi3515 H.264编解码处理器用户手册
- Oracle基础练习题与解答
- 谷歌地球3D建筑筛选新流程详解
- CFO与CIO携手:数据管理与企业增值的战略
- Eclipse IDE基础教程:从入门到精通
- Shell脚本专家宝典:全面学习与资源指南
- Tomcat安装指南:附带JDK配置步骤
- NA3003A电子水准仪数据格式解析与转换研究
- 自动化专业英语词汇精华:必备术语集锦