【Quartz】定时任务框架Quartz 及整合Spring案例

31 篇文章 0 订阅
12 篇文章 0 订阅
本文详细介绍了Quartz作为强大的作业调度工具的使用,包括其核心API、生命周期,以及如何创建一个简单的定时任务案例。此外,还展示了Quartz如何与Spring框架整合,通过配置文件实现任务调度,提供了详细的步骤和代码示例。
摘要由CSDN通过智能技术生成


【前言】

Quartz具有强大的调度功能、灵活的应用方式和分布式、集群能力,今天我们介绍Quartz定时任务的使用。

【正文】

一、概述

Quartz是Job scheduling(作业调度)领域的一个开源项目,Quartz既可以单独使用也可以跟spring框架整合使用,在实际开发中一般会使用后者。使用Quartz可以开发一个或者多个定时任务,每个定时任务可以单独指定执行的时间,例如每隔1小时执行一次、每个月第一天上午10点执行一次、每个月最后一天下午5点执行一次等。

官网:https://www.w3cschool.cn/quartz_doc/

二、核心API

Scheduler:任务调度器,所有的任务都是从这里开始。
Trigger:触发器,定义任务执行的方式、间隔。
JobDetail & Job : 定义任务具体执行的逻辑。

三、生命周期

Scheduler的生命期,从SchedulerFactory创建它时开始,到Scheduler调用shutdown()方法时结束;
Scheduler被创建后,可以增加、删除和列举Job和Trigger,以及执行其它与调度相关的操作(如暂停Trigger);
但是,Scheduler只有在调用start()方法后,才会真正地触发trigger(即执行job)。

四、Quartz 入门案例

(一)创建项目

创建maven项目,目录结构如下
在这里插入图片描述

(二)配置quartz

导入maven坐标

pom.xml:

<dependencies>
        <!--引入Quartz的依赖-->
        <dependency>
            <groupId>org.quartz-scheduler</groupId>
            <artifactId>quartz</artifactId>
            <version>2.2.1</version>
        </dependency>
        <dependency>
            <groupId>org.quartz-scheduler</groupId>
            <artifactId>quartz-jobs</artifactId>
            <version>2.2.1</version>
        </dependency>
    </dependencies>

(三)创建TestJob类

参考官方文档,创建任务、触发器、调度器等,实现一个定时任务的小例子

package com.quartzlearn.test;

import com.quartzlearn.job.HelloQuartz;
import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;

/**
 * @program: quartz_demo
 * @description:
 * @author: txg
 * @create: 2021-10-11 16:25
 **/
public class TestJob {
    public static void main(String[] args) throws Exception{
        //1:任务详情 Job
        JobDetail jobDetail = JobBuilder.newJob(HelloQuartz.class)
                .usingJobData("name","txg")
                .withIdentity("jobname1","jobgroup1")
                .build();

        //2:触发器 Trigger 
        //withIntervalInSeconds的参数为间隔时间1s
        SimpleTrigger trigger = TriggerBuilder.newTrigger()
                .withIdentity("triggername1", "triggergroup1")
                .withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(1).repeatForever())
                .build();

        //3:调度器 scheduler
        Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();

        //4:组合任务和触发器
        scheduler.scheduleJob(jobDetail,trigger);
        scheduler.start();

		//休眠8s
        try {
            Thread.sleep(8000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        scheduler.shutdown();
    }
}

(四)创建HelloQuartz类

该类为具体的任务类,创建一个定时在控制台打印的任务

package com.quartzlearn.job;

/**
 * @program: quartz_demo
 * @description: 具体任务类
 * @author: txg
 * @create: 2021-10-11 16:24
 **/

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

import java.util.Date;

/**
 * 具体任务类:
 * 例如:定时清理图片,清理数据库表临时数据等,一般为周期性执行
 */

public class HelloQuartz implements Job{

    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
        Object name = context.getJobDetail().getJobDataMap().get("name");
        System.out.println("name = " + name);
        System.out.println("time = " + new Date());
    }
}

(五)运行程序

该例子的意思是,每隔1s,执行HelloQuartz定时任务,执行8s后休眠,那么一共将在控制台打印1+8=9次。

在这里插入图片描述

五、Quartz整合spring

项目目录结构:

注意 web.xml 必须建立在 main 路径底下
在这里插入图片描述

(一)导入jar包

打包方式为war,并导入Quartz和spring相关坐标

pom.xml:

<?xml version="1.0" encoding="UTF-8"?>
<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>org.example</groupId>
    <artifactId>quartz_demo</artifactId>
    <version>1.0-SNAPSHOT</version>

    <packaging>war</packaging>

    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context-support</artifactId>
            <version>5.0.2.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-tx</artifactId>
            <version>5.0.2.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>5.0.2.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.quartz-scheduler</groupId>
            <artifactId>quartz</artifactId>
            <version>2.2.1</version>
        </dependency>
        <dependency>
            <groupId>org.quartz-scheduler</groupId>
            <artifactId>quartz-jobs</artifactId>
            <version>2.2.1</version>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.tomcat.maven</groupId>
                <artifactId>tomcat7-maven-plugin</artifactId>
                <configuration>
                    <!-- 指定端口 -->
                    <port>8080</port>
                    <!-- 请求路径 -->
                    <path>/</path>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

(二)创建Job

类名方法名自己定义,可以后面的配置文件中配置对应的方法

package com.quartzlearn.job;

import java.util.Date;

/**
 * @program: quartz_demo
 * @description: 任务类
 * @author: txg
 * @create: 2021-10-11 17:29
 **/

public class JobDemo {
    public void run(){
        System.out.println("time"+new Date());
    }
}

(三)提供Spring配置文件

配置文件:application-jobs.xml;
配置自定义Job、任务描述、触发器、调度工厂等

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
                  http://www.springframework.org/schema/beans/spring-beans.xsd
                  http://www.springframework.org/schema/context
                  http://www.springframework.org/schema/context/spring-context.xsd">


    <!--1:声明任务对象:注册自定义Job-->
    <bean id="jobDemo" class="com.quartzlearn.job.JobDemo"></bean>

    <!--2:任务详情:创建JobDetail对象,作用是负责通过反射调用指定的Job,注入目标对象,注入目标方法-->
    <bean id="jobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
        <property name="targetObject" ref="jobDemo"></property>
        <property name="targetMethod" value="run"></property>
    </bean>

    <!--3:注册触发器:指定任务触发的时间-->
    <bean id="trigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
        <property name="jobDetail" ref="jobDetail"></property>
        <!--指定触发的时间,基于Cron表达式(0/10表示从0秒开始,每10秒执行一次-->
        <!--cron表达式顺序:秒 分 时 几号 几月 星期几 年-->
        <property name="cronExpression">
            <value>0/10 * * * * ? *</value>
        </property>
    </bean>

    <!--4:注册调度器:统一的调度工厂,通过这个调度工厂调度任务-->
    <bean id="scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
        <property name="triggers">
            <!--可注入多个触发器-->
            <ref bean="trigger"></ref>
        </property>
    </bean>
</beans>

(四)配置web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xmlns="http://java.sun.com/xml/ns/javaee"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
         id="WebApp_ID" version="3.0">

    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:application-jobs.xml</param-value>
    </context-param>
</web-app>

(五)启动tomcat完成测试

每10s将执行一次run方法,执行程序结果如下:

在这里插入图片描述

【结语】

以上就是搭建定时任务quartz框架的案例,和quartz整合spring的案例!



感谢你的支持~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cakeAndAle

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值