spring框架使用Quartz执行定时任务实例详解

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云原生数据库 PolarDB MySQL 版,通用型 2核4GB 50GB
简介: 版权声明:本文为博主原创文章,如需转载,请标明出处。 https://blog.csdn.net/alan_liuyue/article/details/80382324 Quartz简介  1.Quartz,是一个完全由java编写的开源作业调度框架。
版权声明:本文为博主原创文章,如需转载,请标明出处。 https://blog.csdn.net/alan_liuyue/article/details/80382324

Quartz简介

  1.Quartz,是一个完全由java编写的开源作业调度框架。它包含了调度器监听、作业和触发器监听,而我们在项目中最常用到的就是它可以作为一个定时器,可以随时配置监听、触发任务进行作业。
  2.在Spring的框架里,Quartz已经被很好地集成,我们只需要在xml文件里面配一下定时时间就可以自动执行任务了。
  3.本博客主要介绍的是一个quartz项目的完整的搭建、配置以及成功运行的过程,里面包含了多个定时器的配置以及多个数据库的配置方法,非常适合新手去接触和掌握quartz的使用而且还附有完整的quartz定时器项目实例下载,项目下载地址:QuartzTask定时器项目实例

项目实例详解

  1.首先我们看一下整个项目的结构,最基本的spring架构:
 这里写图片描述
  2.接下来我们将逐个步骤去搭建、配置以及运行这个项目,每个步骤在项目里面我都配有详细的说明,
   (1)首先,我们看一下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" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
  <listener>
    <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
  </listener>
  <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>

  <!-- 加载spring配置文件 -->
  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath*:applicationContext*.xml</param-value>
  </context-param>
  <context-param>
    <param-name>log4jConfigLocation</param-name>
    <param-value>classpath:log4j.properties</param-value>
  </context-param>
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>

   (2)其次,我们看一下加载的spring配置文件applicationContext.xml配置: 

    <!-- 加载配置属性文件,数据库文件 -->
    <context:property-placeholder ignore-unresolvable="true" location="classpath:/jdbc.properties" />

    <!-- 使用Annotation自动注册Bean -->
    <context:component-scan base-package="com.hqc"><!-- base-package 如果多个,用“,”分隔 -->
        <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
    </context:component-scan>

    <!-- 数据源可自行配置添加多个,这里只演示postgresql和mysql数据源示例,需要哪些可自行添加测试,都是经过实践成功的-->
    <!-- Postgresql数据库连接配置 -->
    <bean id="postgresqlDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
        <property name="driverClassName" value="org.postgresql.Driver"></property>
        <property name="url" value="jdbc:postgresql://localhost:2345/jftest"></property>
        <property name="username" value="postgres"></property>
        <property name="password" value="1234"></property>
        <property name="initialSize" value="20"></property>
        <property name="maxActive" value="20"></property>
        <property name="defaultAutoCommit" value="true"></property>
    </bean>

    <!-- Mysql数据库连接配置-->
    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"  destroy-method="close">
      <property name="driverClassName" value="${jdbc.driver}" /> 
      <property name="url" value="${jdbc.url}" /> 
      <property name="username" value="${jdbc.username}" />       
      <property name="password" value="${jdbc.password}" />
    </bean>

    <!-- oracle数据库连接配置, 使用 BoneCP数据库连接池 
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close"> 
        <property name="driverClassName" value="${jdbc.driver}" />
        <property name="url" value="${jdbc.url}" />
        <property name="username" value="${jdbc.username}" />
        <property name="password" value="${jdbc.password}" />
        <property name="initialSize" value="${jdbc.pool.init}" />
        <property name="minIdle" value="${jdbc.pool.minIdle}" /> 
        <property name="maxActive" value="${jdbc.pool.maxActive}" />
        <property name="maxWait" value="60000" />
        <property name="timeBetweenEvictionRunsMillis" value="60000" />
        <property name="minEvictableIdleTimeMillis" value="300000" />
        <property name="validationQuery" value="${jdbc.testSql}" />
        <property name="testWhileIdle" value="true" />
        <property name="testOnBorrow" value="false" />
        <property name="testOnReturn" value="false" />
        <property name="filters" value="stat" /> 
    </bean>-->
    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource">
            <ref bean="dataSource" />
        </property>
    </bean>

    <!-- Greenplum数据库连接配置 
    <bean id="postgresqlDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
        <property name="driverClassName" value="com.pivotal.jdbc.GreenplumDriver"></property>
        <property name="url" value="jdbc:pivotal:greenplum://localhost:2345;DatabaseName=jftest"></property>
        <property name="username" value="greenplum"></property>
        <property name="password" value="1234"></property>
        <property name="initialSize" value="20"></property>
        <property name="maxActive" value="20"></property>
        <property name="defaultAutoCommit" value="true"></property>
    </bean>-->

    <!-- 定时器1 -->
    <bean id="taskTrigger1" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
        <property name="jobDetail">
            <bean
                class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
                <property name="targetObject">
                    <bean class="com.hqc.service.DataStaticService"></bean><!--目标类-->
                </property>
                <property name="targetMethod" value="testMethod1" /><!--目标方法-->
                <property name="concurrent" value="false" />
            </bean>
        </property>
        <property name="cronExpression">
            <!-- 秒、分、时、日期、月份、星期、年 -->
            <!-- 具体的更多的写法可以参照:https://blog.csdn.net/alan_liuyue/article/details/80222565 -->
            <value>0/5 * * * * ? </value>  <!-- 每五秒执行一次 -->
        </property>
    </bean>

    <!-- 定时器2-->
    <bean id="taskTrigger2" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
        <property name="jobDetail">
            <bean class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
                <property name="targetObject">
                    <bean class="com.hqc.service.DataStaticService"></bean>
                </property>
                <property name="targetMethod" value="testMethod2" />
                <property name="concurrent" value="false" />
            </bean>
        </property>
        <property name="cronExpression">
             <value>0 0 0/1 * * ?</value> <!-- 每一小时执行一次 -->
        </property>
    </bean>



    <!-- 总调度用于启动Spring定时器,可以启动多个,需要启动哪一个就去掉注释即可-->
    <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
        <property name="triggers">
            <list>
                <ref bean="taskTrigger1" /> <!--调度第一个定时任务 -->
                <ref bean="taskTrigger2" /> <!--调度第二个定时任务 -->
            </list>
        </property>
    </bean>

   (3)然后,就是数据库的配置文件jdbc.properties,这个文件可以将所有的数据库连接属性都写在里面,当然你也可以直接在applicationContext.xml里面直接配置数据库信息,一个项目可以配置多个数据源,相信大家都是没问题的:

##oracle数据库配置
#jdbc.type=oracle
#jdbc.driver=oracle.jdbc.driver.OracleDriver
#jdbc.url=jdbc:oracle:thin:@localhost:1521:testora
#jdbc.username=test
#jdbc.password=test
##pool settings
#jdbc.pool.init=10
#jdbc.pool.minIdle=30
#jdbc.pool.maxActive=50
##jdbc.testSql=SELECT 'x'
#jdbc.testSql=SELECT 'x' FROM DUAL

#mysql数据库配置
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/jftest?useSSL=false&useUnicode=true&characterEncoding=UTF-8
jdbc.username=root
jdbc.password=1234

   (4)接下来我们再讲一下项目里面的各个文件的作用,这里直接用一张图给大家进行展示说明:
   这里写图片描述
   (5)我们看一下在配置文件里quartz指定的定时执行的方法:

/**
 * 
 * @author hqc
 * @version 2018年05月20日
 *
 */
public class DataStaticService {
    protected static Logger logger = Logger.getLogger(DataStaticService.class);

    @Autowired
    DataPostgresqlDao dataPostgresqlDao;

    @Autowired
    DataOracleDao dataOracleDao;

    /**
     * 测试定时方法1
     */
    public void testMethod1(){
        Calendar c = Calendar.getInstance();
        String today = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(c.getTime()); 
        System.out.println("定时任务程序运行时间:"+today);
        System.out.println("定时查询oracle库t_user表的数据数量:"+dataOracleDao.queryTest().size());    
    }

    /**
     * 测试定时方法2
     */
    public void testMethod2(){
        Calendar c = Calendar.getInstance();
        String today = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(c.getTime()); 
        //昨天的当前时间
//      c.add(Calendar.DATE, -1);
//      String yesterday = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(c.getTime());
        System.out.println("定时任务程序运行时间:"+today);
        System.out.println("定时查询postgresql库t_user表的数据数量:"+dataPostgresqlDao.queryTest().size());

    }

}

   (6)最后,我们看一下定时任务执行的效果,这里我设置的是每5秒执行一次:
   这里写图片描述

总结

  1.好了,以上就是spring框架使用Quartz执行定时任务完整实例详解,很适合新手去熟悉和掌握quartz;
  2.实践是认识真理性的唯一标准,通过这一个简单的项目实践,有兴趣的小伙伴们能继续去深入研究,从而形成一套适合自己的定时器项目,在项目中运用的时候就会事半功倍;

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
20天前
|
数据采集 监控 前端开发
二级公立医院绩效考核系统源码,B/S架构,前后端分别基于Spring Boot和Avue框架
医院绩效管理系统通过与HIS系统的无缝对接,实现数据网络化采集、评价结果透明化管理及奖金分配自动化生成。系统涵盖科室和个人绩效考核、医疗质量考核、数据采集、绩效工资核算、收支核算、工作量统计、单项奖惩等功能,提升绩效评估的全面性、准确性和公正性。技术栈采用B/S架构,前后端分别基于Spring Boot和Avue框架。
|
24天前
|
前端开发 Java 数据库连接
Spring 框架:Java 开发者的春天
Spring 框架是一个功能强大的开源框架,主要用于简化 Java 企业级应用的开发,由被称为“Spring 之父”的 Rod Johnson 于 2002 年提出并创立,并由Pivotal团队维护。
43 1
Spring 框架:Java 开发者的春天
|
16天前
|
JavaScript 安全 Java
如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个前后端分离的应用框架,实现动态路由和菜单功能
本文介绍了如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个前后端分离的应用框架,实现动态路由和菜单功能。首先,确保开发环境已安装必要的工具,然后创建并配置 Spring Boot 项目,包括添加依赖和配置 Spring Security。接着,创建后端 API 和前端项目,配置动态路由和菜单。最后,运行项目并分享实践心得,帮助开发者提高开发效率和应用的可维护性。
34 2
|
16天前
|
消息中间件 NoSQL Java
springboot整合常用中间件框架案例
该项目是Spring Boot集成整合案例,涵盖多种中间件的使用示例,每个案例项目使用最小依赖,便于直接应用到自己的项目中。包括MyBatis、Redis、MongoDB、MQ、ES等的整合示例。
66 1
|
24天前
|
Java 数据库连接 开发者
Spring 框架:Java 开发者的春天
【10月更文挑战第27天】Spring 框架由 Rod Johnson 在 2002 年创建,旨在解决 Java 企业级开发中的复杂性问题。它通过控制反转(IOC)和面向切面的编程(AOP)等核心机制,提供了轻量级的容器和丰富的功能,支持 Web 开发、数据访问等领域,显著提高了开发效率和应用的可维护性。Spring 拥有强大的社区支持和丰富的生态系统,是 Java 开发不可或缺的工具。
|
Java 调度 Maven
spring boot 2.0 quartz 轻松实现定时任务和作业调度
spring boot 2.0 quartz 轻松实现定时任务和作业调度
122 0
|
存储 消息中间件 SQL
spring-boot-route(二十一)quartz实现动态定时任务
spring-boot-route(二十一)quartz实现动态定时任务
253 0
spring-boot-route(二十一)quartz实现动态定时任务
|
存储 负载均衡 Java
实战 | 使用Spring Boot + Quartz 实现分布式定时任务平台
本文将从项目实战出发来介绍分布式定时任务的实现。在某些应用场景下要求任务必须具备高可用性和可扩展性,单台服务器不能满足业务需求,这时就需要使用Quartz实现分布式定时任务。
实战 | 使用Spring Boot + Quartz  实现分布式定时任务平台
|
XML Java 调度
JAVA | Spring + quartz 实现定时任务
很久不见,因为忙着泡妞,断更了一个月,实在是罪过。废话不多说,最近在工作中遇到了使用 quartz 实现定时任务的需求。写出来分享给大家,权当笔记。
JAVA | Spring + quartz 实现定时任务
|
开发框架 Java 测试技术
Spring Boot整合Quartz定时任务框架
Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与J2EE与J2SE应用程序相结合也可以单独使用。Quartz可以用来创建简单或为运行十个,百个,甚至是好几万个Jobs这样复杂的程序。Jobs可以做成标准的Java组件或 EJBs。Quartz的最新版本为Quartz 2.3.0。
Spring Boot整合Quartz定时任务框架