[java]spring-Quartz定时任务

简介: [java]spring-Quartz定时任务

java有三种定时任务的实现方法


一种是使用Timer类来调度任务


第二种是Quartz来实现


第三种是spring的Task来实现


今天咱们来说一下使用Quartz如何来实现定时任务。


什么是Quartz?


Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与J2EE与J2SE应用程序相结合也可以单独使用。Quartz可以用来创建简单或为运行十个,百个,甚至是好几万个Jobs这样复杂的程序。Jobs可以做成标准的Java组件或 EJBs。Quartz的最新版本为Quartz 2.3.0。


Quartz组成


Job:任务,要调度的任务/方法。


Trigger:触发器,什么时候触发任务,以何种频率触发


Scheduler:调度器,Job和Trigger在这里注册,组合调度。


Quartz实例


下面咱们来写一个简单的Quartz实例,环境是


spring 4.0.6


Quartz 2.2.1


一,引入pom文件


<properties>
        <springframework.version>4.0.6.RELEASE</springframework.version>
        <quartz.version>2.2.1</quartz.version>
    </properties>
    <packaging>war</packaging>
    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>${springframework.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>${springframework.version}</version>
        </dependency>
        <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>
        <!-- spring-tx包必须导入,因为Quartz需要依赖该包 -->
        <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>


二.创建一个要调度的任务类:


package com.springtest.testQuzrtz;
import org.springframework.stereotype.Component;
/**
 * Created by L on 2017-07-18.
 */
@Component
public class MyJob {
    public void execute(){
        System.out.println("Hello" +
                "这里是我们的任务代码!!!!");
    }
}


三.配置文件


因为只是写个测试,所以直接建一个quartz-context.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" xmlns:context="http://www.springframework.org/schema/context"
       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">
    <context:component-scan base-package="com.springtest.testQuzrtz" />
    <!-- 创建任务 -->
    <bean class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean" id="jobDetail">
        <!-- 目标对象 -->
        <property name="targetObject" ref="myJob"/>
        <!-- 目标方法 -->
        <property name="targetMethod" value="execute"/>
    </bean>
    <!-- 创建SimpleTrigger触发器 -->
    <bean class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean" id="simpleTrigger">
        <!-- 引用任务 -->
        <property name="jobDetail" ref="jobDetail"/>
        <!-- 指定循环时间,以秒为单位 -->
        <property name="repeatInterval" value="10000"/>
    </bean>
    <!-- 创建CronTrigger触发器 -->
    <bean class="org.springframework.scheduling.quartz.CronTriggerFactoryBean" id="cronTrigger">
        <!-- 引用任务 -->
        <property name="jobDetail" ref="jobDetail"/>
        <!-- 指定Cron表达式 -->
        <property name="cronExpression" value="*/5 * * * * ?"/>
    </bean>
    <!-- 创建调度器 -->
    <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean" id="stdScheduler" lazy-init="false">
        <property name="triggers">
            <list>
                <!--<ref bean="simpleTrigger"/>-->
                <ref bean="cronTrigger"/>
            </list>
        </property>
    </bean>
</beans>


在这个文件中,我们一共有三步需要做


第一步,创建任务:


    <!-- 创建任务 -->
    <bean class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean" id="jobDetail">
        <!-- 目标对象 -->
        <property name="targetObject" ref="myJob"/>
        <!-- 目标方法 -->
        <property name="targetMethod" value="execute"/>
    </bean>


第二步,创建触发器,这里举两种触发器的例子


<!-- 创建SimpleTrigger触发器 -->
    <bean class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean" id="simpleTrigger">
        <!-- 引用任务 -->
        <property name="jobDetail" ref="jobDetail"/>
        <!-- 指定循环时间,以秒为单位 -->
        <property name="repeatInterval" value="10000"/>
    </bean>
    <!-- 创建CronTrigger触发器 -->
    <bean class="org.springframework.scheduling.quartz.CronTriggerFactoryBean" id="cronTrigger">
        <!-- 引用任务 -->
        <property name="jobDetail" ref="jobDetail"/>
        <!-- 指定Cron表达式 -->
        <property name="cronExpression" value="*/5 * * * * ?"/>
    </bean>


第三步,创建调度器


    <!-- 创建调度器 -->
    <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean" id="stdScheduler" lazy-init="false">
        <property name="triggers">
            <list>
                <!--<ref bean="simpleTrigger"/>-->
                <ref bean="cronTrigger"/>
            </list>
        </property>
    </bean>


PS :别忘了配置包扫描


四.测试


我们为MyJob来创建一个测试类


package com.springtest.testQuzrtz.test;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import static org.junit.Assert.*;
/**
 * Created by L on 2017-07-18.
 */
public class MyJobTest {
    @Test
    public void test() throws InterruptedException {
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("quartz-context.xml");
        Thread.sleep(60000);
    }
}


然后你就会看到我们的MyJob的方法每5秒执行一次。


总结


总的来说,Quartz在这三种中,易用性上还是很好的,而且更适应多变的需求,所以应用挺广泛。

目录
相关文章
|
1月前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
71 2
|
19天前
|
Java 开发者 微服务
Spring Boot 入门:简化 Java Web 开发的强大工具
Spring Boot 是一个开源的 Java 基础框架,用于创建独立、生产级别的基于Spring框架的应用程序。它旨在简化Spring应用的初始搭建以及开发过程。
38 6
Spring Boot 入门:简化 Java Web 开发的强大工具
|
1月前
|
人工智能 前端开发 Java
基于开源框架Spring AI Alibaba快速构建Java应用
本文旨在帮助开发者快速掌握并应用 Spring AI Alibaba,提升基于 Java 的大模型应用开发效率和安全性。
基于开源框架Spring AI Alibaba快速构建Java应用
|
2月前
|
前端开发 Java 数据库连接
Spring 框架:Java 开发者的春天
Spring 框架是一个功能强大的开源框架,主要用于简化 Java 企业级应用的开发,由被称为“Spring 之父”的 Rod Johnson 于 2002 年提出并创立,并由Pivotal团队维护。
77 1
Spring 框架:Java 开发者的春天
|
2月前
|
Java 数据库连接 开发者
Spring 框架:Java 开发者的春天
【10月更文挑战第27天】Spring 框架由 Rod Johnson 在 2002 年创建,旨在解决 Java 企业级开发中的复杂性问题。它通过控制反转(IOC)和面向切面的编程(AOP)等核心机制,提供了轻量级的容器和丰富的功能,支持 Web 开发、数据访问等领域,显著提高了开发效率和应用的可维护性。Spring 拥有强大的社区支持和丰富的生态系统,是 Java 开发不可或缺的工具。
|
2月前
|
JSON Java Maven
实现Java Spring Boot FCM推送教程
本指南介绍了如何在Spring Boot项目中集成Firebase云消息服务(FCM),包括创建项目、添加依赖、配置服务账户密钥、编写推送服务类以及发送消息等步骤,帮助开发者快速实现推送通知功能。
109 2
|
1月前
|
Java 数据库连接 API
Spring 框架的介绍(Java EE 学习笔记02)
Spring是一个由Rod Johnson开发的轻量级Java SE/EE一站式开源框架,旨在解决Java EE应用中的多种问题。它采用非侵入式设计,通过IoC和AOP技术简化了Java应用的开发流程,降低了组件间的耦合度,支持事务管理和多种框架的无缝集成,极大提升了开发效率和代码质量。Spring 5引入了响应式编程等新特性,进一步增强了框架的功能性和灵活性。
45 0
|
2月前
|
存储 人工智能 Java
将 Spring AI 与 LLM 结合使用以生成 Java 测试
AIDocumentLibraryChat 项目通过 GitHub URL 为指定的 Java 类生成测试代码,支持 granite-code 和 deepseek-coder-v2 模型。项目包括控制器、服务和配置,能处理源代码解析、依赖加载及测试代码生成,旨在评估 LLM 对开发测试的支持能力。
50 1
|
2月前
|
Java BI 调度
Java Spring的定时任务的配置和使用
遵循上述步骤,你就可以在Spring应用中轻松地配置和使用定时任务,满足各种定时处理需求。
158 1
|
1月前
|
安全 Java 测试技术
Java开发必读,谈谈对Spring IOC与AOP的理解
Spring的IOC和AOP机制通过依赖注入和横切关注点的分离,大大提高了代码的模块化和可维护性。IOC使得对象的创建和管理变得灵活可控,降低了对象之间的耦合度;AOP则通过动态代理机制实现了横切关注点的集中管理,减少了重复代码。理解和掌握这两个核心概念,是高效使用Spring框架的关键。希望本文对你深入理解Spring的IOC和AOP有所帮助。
39 0
下一篇
DataWorks