使用Spring整合Quartz轻松完成定时任务

简介: 一、背景   上次我们介绍了如何使用Spring Task进行完成定时任务的编写,这次我们使用Spring整合Quartz的方式来再一次实现定时任务的开发,以下奉上开发步骤及注意事项等。 二、开发环境及必须jar包依赖   1.

 一、背景

  上次我们介绍了如何使用Spring Task进行完成定时任务的编写,这次我们使用Spring整合Quartz的方式来再一次实现定时任务的开发,以下奉上开发步骤及注意事项等。

二、开发环境及必须jar包依赖

  1.开发环境

    Spring 4.2.6.RELEASE

    Maven 3.3.9

    Jdk 1.7

    Idea 15.04

  2.必不可少jar包依赖

 1 <dependency>
 2   <groupId>org.springframework</groupId>
 3   <artifactId>spring-context-support</artifactId>
 4   <version>4.2.6.RELEASE</version>
 5 </dependency>
 6 <dependency>
 7   <groupId>org.quartz-scheduler</groupId>
 8   <artifactId>quartz</artifactId>
 9   <version>2.2.1</version>
10 </dependency>

三、开发步骤

  【1】.基于特定基类

    1. 编写任务类,该类需要继承自QuartzJobBean

 1 package com.hafiz.www.cron;
 2 
 3 import org.quartz.JobExecutionContext;
 4 import org.quartz.JobExecutionException;
 5 import org.slf4j.Logger;
 6 import org.slf4j.LoggerFactory;
 7 import org.springframework.scheduling.quartz.QuartzJobBean;
 8 
 9 /**
10  * Desc:第二个基于Spring Quartz的定时任务
11  * Created by hafiz.zhang on 2016/12/11.
12  */
13 public class SecondCron extends QuartzJobBean {
14     private static final Logger logger = LoggerFactory.getLogger(SecondCron.class);
15     private Integer timeout;
16 
17     //调度工厂实例化后,经过timeout时间开始执行调度
18     public void setTimeout(Integer timeout) {
19         this.timeout = timeout;
20     }
21 
22     @Override
23     protected void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException {
24         logger.info("定时任务2进行中.......");
25         // do something else
26     }
27 }

  2.在spring配置文件中配置作业类JobDetailFactoryBean、作业调度的触发方式(触发器)、调度工厂

 1 <beans xmlns="http://www.springframework.org/schema/beans"
 2        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 3        xmlns:task="http://www.springframework.org/schema/task"
 4        xsi:schemaLocation="http://www.springframework.org/schema/beans
 5         http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
 6         http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task.xsd">
 7 
 8     <bean name="secondCron" class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
 9         <property name="jobClass" value="com.hafiz.www.cron.SecondCron"/>
10         <property name="jobDataAsMap">
11             <map>
12                 <entry key="timeout" value="0"/>
13             </map>
14         </property>
15     </bean>
16 
17     <!--按照一定频率的触发器-->
18     <!--<bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean">
19         <property name="jobDetail" ref="secondCron"/>
20         <property name="startDelay" value="0"/>
21         <property name="repeatInterval" value="2000"/>
22     </bean>-->
23 
24     <!--Cron表达式触发器-->
25     <bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
26         <property name="jobDetail" ref="secondCron"/>
27         <property name="cronExpression" value="0/5 * * * * ?"/>
28     </bean>
29 
30     <!--配置调度工厂-->
31     <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
32         <property name="triggers">
33             <list>
34                 <!--<ref bean="simpleTrigger"/>-->
35                 <ref bean="cronTrigger"/>
36             </list>
37         </property>
38     </bean>
39 </beans>

注意:

  1).org.springframework.scheduling.quartz.JobDetailBean有两个属性.

    jobClass属性即我们在java代码中定义的任务类.

    jobDataAsMap属性即该任务类中需要注入的属性值.

  2).Quartz的作业触发器有两种(两种任选其一就行)

    org.springframework.scheduling.quartz.SimpleTriggerFactoryBean:只支持按照一定频度调用任务,如每隔30分钟运行一次.

    org.springframework.scheduling.quartz.CronTriggerFactoryBean:支持到指定时间运行一次,如每天12:00运行一次等.

    关于第二种触发器的Cron表达式,请参见另一篇博客:摆脱Spring 定时任务的@Scheduled cron表达式的困扰

  3).org.springframework.scheduling.quartz.SchedulerFactoryBean的参数triggers指定的就是之前配置的触发器的名字.

    3.运行结果

   

  【2】.不基于特定的基类

    1.编写任务调度类

 1 package com.hafiz.www.cron;
 2 
 3 import org.slf4j.Logger;
 4 import org.slf4j.LoggerFactory;
 5 
 6 /**
 7  * Desc:基于Spring整合Quartz进行完成定时任务
 8  * Created by hafiz.zhang on 2016/12/11.
 9  */
10 public class ThirdCron {
11     private static final Logger logger = LoggerFactory.getLogger(ThirdCron.class);
12 
13     public void executeJob() {
14         logger.info("定时任务3进行中.......");
15         // do something else
16     }
17 }

    2.在spring配置文件中配置作业类MethodInvokingJobDetailFactoryBean、作业调度的触发方式(触发器)、调度工厂

 1 <beans xmlns="http://www.springframework.org/schema/beans"
 2        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 3        xsi:schemaLocation="http://www.springframework.org/schema/beans
 4         http://www.springframework.org/schema/beans/spring-beans-3.2.xsd">
 5 
 6     <bean name="thirdCron" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
 7         <property name="targetObject">
 8             <bean class="com.hafiz.www.cron.ThirdCron"/>
 9         </property>
10         <property name="targetMethod" value="executeJob"/>
11         <!--作业不并发调度-->
12         <property name="concurrent" value="false"/>
13     </bean>
14 
15     <!--按照一定频率的触发器-->
16     <!--<bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean">
17         <property name="jobDetail" ref="thirdCron"/>
18         <property name="startDelay" value="0"/>
19         <property name="repeatInterval" value="2000"/>
20     </bean>-->
21 
22     <!--Cron表达式触发器-->
23     <bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
24         <property name="jobDetail" ref="thirdCron"/>
25         <property name="cronExpression" value="0/5 * * * * ?"/>
26     </bean>
27 
28     <!--配置调度工厂-->
29     <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
30         <property name="triggers">
31             <list>
32                 <!--<ref bean="simpleTrigger"/>-->
33                 <ref bean="cronTrigger"/>
34             </list>
35         </property>
36     </bean>
37 </beans>

注意:MethodInvokingJobDetailFactoryBean,有两个关键属性:

    targetObject指定任务类.

    targetMethod指定运行的方法.

    3.运行结果

   

四、总结

  Quartz属于重量级的定时任务框架,我们一般都会选择轻量级的如Spring Task定时任务进行开发,但是遇到比较棘手的,这也是一种解决问题的方式。

相关文章
|
4月前
|
Java 数据库 Spring
Spring Boot 实现定时任务的动态增删启停
Spring Boot 实现定时任务的动态增删启停
73 0
|
26天前
|
资源调度 Java 调度
Spring Cloud Alibaba 集成分布式定时任务调度功能
定时任务在企业应用中至关重要,常用于异步数据处理、自动化运维等场景。在单体应用中,利用Java的`java.util.Timer`或Spring的`@Scheduled`即可轻松实现。然而,进入微服务架构后,任务可能因多节点并发执行而重复。Spring Cloud Alibaba为此发布了Scheduling模块,提供轻量级、高可用的分布式定时任务解决方案,支持防重复执行、分片运行等功能,并可通过`spring-cloud-starter-alibaba-schedulerx`快速集成。用户可选择基于阿里云SchedulerX托管服务或采用本地开源方案(如ShedLock)
|
1月前
|
Java 关系型数据库 MySQL
SpringBoot 集成 Quartz + MySQL
SpringBoot 集成 Quartz + MySQL
63 1
|
2月前
|
资源调度 Java 调度
Spring Cloud Alibaba 集成分布式定时任务调度功能
Spring Cloud Alibaba 发布了 Scheduling 任务调度模块 [#3732]提供了一套开源、轻量级、高可用的定时任务解决方案,帮助您快速开发微服务体系下的分布式定时任务。
14593 25
|
19天前
|
Java 开发者 Spring
Spring Boot实战宝典:揭秘定时任务的幕后英雄,让业务处理如流水般顺畅,轻松驾驭时间管理艺术!
【8月更文挑战第29天】在现代应用开发中,定时任务如数据备份、报告生成等至关重要。Spring Boot作为流行的Java框架,凭借其强大的集成能力和简洁的配置方式,为开发者提供了高效的定时任务解决方案。本文详细介绍了如何在Spring Boot项目中启用定时任务支持、编写定时任务方法,并通过实战案例展示了其在业务场景中的应用,同时提供了注意事项以确保任务的正确执行。
29 0
|
28天前
|
Dubbo Java 调度
揭秘!Spring Cloud Alibaba的超级力量——如何轻松驾驭分布式定时任务调度?
【8月更文挑战第20天】在现代微服务架构中,Spring Cloud Alibaba通过集成分布式定时任务调度功能解决了一致性和可靠性挑战。它利用TimerX实现任务的分布式编排与调度,并通过`@SchedulerLock`确保任务不被重复执行。示例代码展示了如何配置定时任务及其分布式锁,以实现每5秒仅由一个节点执行任务,适合构建高可用的微服务系统。
44 0
|
4月前
|
NoSQL Java Redis
Spring Boot 监听 Redis Key 失效事件实现定时任务
Spring Boot 监听 Redis Key 失效事件实现定时任务
114 0
|
2月前
|
SQL Java 调度
实时计算 Flink版产品使用问题之使用Spring Boot启动Flink处理任务时,使用Spring Boot的@Scheduled注解进行定时任务调度,出现内存占用过高,该怎么办
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
2月前
|
XML Java Linux
Spring Task 定时任务没有定时执行是为什么?
Spring Task 定时任务没有定时执行是为什么?
40 2
|
3月前
|
Java Spring
解密Spring Boot的定时任务
解密Spring Boot的定时任务
18 0