新任务管理系统YYSchedule-细节-spring整合quartz2.x

本文介绍Quartz任务调度框架的基本概念与环境搭建步骤,并通过一个实战案例展示如何配置任务执行类、触发器及调度器,实现定时任务的运行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、quartz简介

  Quartz是一个开源的任务调度框架。基于定时、定期的策略来执行任务是它的核心功能,比如x年x月的每个星期五上午8点到9点,每隔10分钟执行1次。Quartz有3个核心要素:调度器(Scheduler)、任务(Job)、触发器(Trigger)。Quartz完全使用Java开发,可以集成到各种规模的应用程序中。它能够承载成千上万的任务调度,并且支持集群。它支持将数据存储到数据库中以实现持久化,并支持绝大多数的数据库。它将任务与触发设计为松耦合,即一个任务可以对应多个触发器,这样能够轻松构造出极为复杂的触发策略。

二、环境搭建

  我们需要将maven pom.xml中添加以下信息

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
 
  <groupId>settle</groupId>
  <artifactId>spring-quartz</artifactId>
  <version>1.0.0</version>
  <packaging>jar</packaging>
  <name>spring-quartz</name>
  <url>http://maven.apache.org</url>
 
	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<springframework.version>4.2.2.RELEASE</springframework.version>
		<quartz.version>2.2.2</quartz.version>
	</properties>
 
	<dependencies>
		<dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>${springframework.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context-support</artifactId>
            <version>${springframework.version}</version>
        </dependency>
        <!-- Transaction dependency is required with Quartz integration -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-tx</artifactId>
            <version>${springframework.version}</version>
        </dependency>
         
        <!-- Quartz framework -->
        <dependency>
            <groupId>org.quartz-scheduler</groupId>
            <artifactId>quartz</artifactId>
            <version>${quartz.version}</version>
        </dependency>
	</dependencies>
</project>

三、简单例子

  在quartz2.x中,我们只需要保证job,trigger以及Scheduler factory在applicationContext.xml中进行配置即可。

1、job执行类

  我们自定义一个job执行类HeartBeatDetector,在配置完成后,其中的execute方法会按计划定期执行。

  

@Component("HeartBeatDetector")
public class HeartBeatDetector {

    /**
	 * 使用quartz定时执行execute方法
	 * @throws JobExecutionException
	 */
	public void execute() throws JobExecutionException {
		System.out.println("execute " +  new Date());
    }
}

2、job的配置

  job有两种配置方式,分别是MethodInvokingJobDetailFactoryBean以及JobDetailFactoryBean。后者可以在方法中注入参数,由于没有参数需求,本次使用的是MethodInvokingJobDetailFactoryBean。

	<!-- job的定义 -->
	<bean id="HeartBeatDetectorJob" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
		<property name="targetObject" ref="HeartBeatDetector" />
        <property name="targetMethod" value="execute" />
	</bean>

3、trigger的配置

  trigger同样也有两种配置方式,分别是SimpleTriggerFactoryBean以及CronTriggerFactoryBean。我使用也推荐使用的是后者CronTriggerFactoryBean,因为后者可以设计规范的时间方案。

	<!-- Trigger 触发器 -->
    <bean id="HeartBeatDetectorJob_Trigger"  class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
        <property name="jobDetail" ref="HeartBeatDetectorJob" />
        <!--<property name="cronExpression" value="0/5 * * ? * SAT-SUN" />-->
        <property name="cronExpression" value="0/15 * * ? * *" />
    </bean>

关于cronExpression,详见https://www.cnblogs.com/jearay/p/3667906.html

 

4、Scheduler factory的配置

  Scheduler factory的配置也很简单,就是将上述定义的job和trigger作为property设置在factory中即可。

<!-- Scheduler factory bean-->
    <bean  class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
        <property name="jobDetails">
            <list>
                <ref bean="HeartBeatDetectorJob" />
            </list>
        </property>
 
        <property name="triggers">
            <list>
                <ref bean="HeartBeatDetectorJob_Trigger" />
            </list>
        </property>
    </bean>

 

5、applicationContext-quartz完整实例:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p"
    xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
    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-4.0.xsd
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
    http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
    http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd">

	<context:component-scan base-package="com.YYSchedule.node.detector" />

	<!-- job的定义 -->
	<bean id="HeartBeatDetectorJob" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
		<property name="targetObject" ref="HeartBeatDetector" />
        <property name="targetMethod" value="execute" />
	</bean>
	
	<!-- Trigger 触发器 -->
    <bean id="HeartBeatDetectorJob_Trigger"  class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
        <property name="jobDetail" ref="HeartBeatDetectorJob" />
        <!--<property name="cronExpression" value="0/5 * * ? * SAT-SUN" />-->
        <property name="cronExpression" value="0/15 * * ? * *" />
    </bean>

	<!-- Scheduler factory bean-->
    <bean  class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
        <property name="jobDetails">
            <list>
                <ref bean="HeartBeatDetectorJob" />
            </list>
        </property>
 
        <property name="triggers">
            <list>
                <ref bean="HeartBeatDetectorJob_Trigger" />
            </list>
        </property>
    </bean>

</beans>

 

6、结果:

四、YYShedule具体实例:

  实际代码中,仅仅对execute方法进行了修改,其他文件并不需要修改,而execute方法的具体内容,请见“新调度平台-n-

task与node进行交互具体实现”

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值