首页 > 其他分享 >Spring Boot入坑-8-定时任务

Spring Boot入坑-8-定时任务

时间:2024-06-09 12:33:43浏览次数:21  
标签:Spring Boot job JOB 任务 定时 xxl 入坑 XXL

概述

  • 在企业级的项目业务中,往往会有一系列的任务需要在有逻辑的指定时间点执行,如系统间定时同步数据、定时做某个复杂的计算、订单提交后30分钟需要付款等

  • 上述这些,就需要任务的定时调度与执行来完成,这是程序的基本需要

  • 在Java语言中,提供了基础的基于Timer和ScheduledExecutorService线程池的定时任务处理

  • 在Spring Boot中,支持注解式编程式平台式种方式实现定时任务

    • 注解式

      • 简单、易用,但不够灵活

      • 与项目集成一体,通用性不强,项目停止,定时功能也终止

      • 主要注解有

        • @EnableScheduling:启用定时任务注解,标识启动类

        • @Scheduled:定时任务逻辑方法注解,配合Cron表达式,可在程序启动后,按要求执行定时任务

    • 编程式

      • 一般使用Quartz等框架实现

      • 灵活,需要编写一些代码

    • 平台式

      • 独立于单个业务项目,让业务项目专注于业务,只要提供回调接口

      • 一般会提供所有定时任务查看,并能对所有任务进行管理,更符合企业需要

      • 常用的任务调用平台有SchedulerX、XXL-JOB等

Cron表达式

  • 针对定时的规则,有很多种表达方式,比如5分钟后执行、明天5点执行、每周二早上10点执行等

  • 为了表达这些灵活且多样化的时间规则,通常会使用Cron表达式进行

  • Cron表达式规则:通过类似时间倒置形式,以5或6个空格隔开,分为6或7个段,每一个段代表一个时间部分,常见以下两种格式

    • 秒 分 小时 每月第几天 月份 每周第几天 年

    • 秒 分 小时 每月第几天 月份 每周第几天

      其中蓝色和红色互斥,但配置其中一个,另一个为配置为?

  • Cron主要规则如下图

    Cron表达式图
  • Cron表达式中的符号意义

    • *:表示所有可能的值

    • /:表示数值的增量,简单来说,比如分写上0/5表示从0分开始,每隔5分钟

    • ?:仅用在天(月)和天(周),表示不指定值,当其中一个有值时,另外一个需要设为?

    • L:last,表示一月的最后一天或一周的最后一天

    • W:work,表示有效工作日(周一到周五)

  • Cron表达式实例

    • 0 0 12 * * ? 每天中午12点触发1次

    • 0 0/30 * * * ? 每30分钟触发1次

    • 0 0 12 ? * 2-6 周一至周五的12点触发1次

    • 3 25 19 26 8 ? 2029 指定时间点执行1次

注解式

概述

  • 直接在项目中使用,简单、易用

  • 使用@Schedule注解

  • @Schedule中可配置几种方式

    • cron,定时

    • fixRate,固定频率

    • fixDelay,固定延迟

使用步骤

  1. 添加启动注解:在启动类上添加@EnableScheduling注解

  2. 添加定时任务方法:按照业务需要添加定时任务方法,并在方法上加上@Scheduled注解;见附件项目中的job.ScheduledJob类

  3. 自动生效:程序启动后,自动生效

【演示】

  1. Spring Boot中使用声明式定时任务,见附件项目springboot-schedule-annotation

【练习】

  1. 练习实例内容,完成代码编写

Quartz【了解】

概述

  • OpenSymphony开源组织在任务调度领域的一个开源项目,完全由Java开发,可以用来执行定时任务,其特点有:

    • 作业持久性:就是保持调度定时的状态,并落地到数据库

    • 作业管理:对调度作业进行有效的管理,比如手动启动、停止等操作

  • 常见的应用场景:购票/购物付款的到期订单作废;自定义的消息提醒;job作业平台等

  • 特点:灵活,易用;与项目强耦合,不能面向多个项目;项目停止定时也终止;可开发定时任务平台

使用步骤

  1. 添加依赖:在pom.xml中添加依赖

    <!--【Quartz】1、添加依赖-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-quartz</artifactId>
    </dependency>
  2. 添加启动注解:在启动类上添加@ EnableScheduling注解

  3. 添加定时任务:定义Job,继承QuartzJobBean,并覆写其executeInternal方法

  4. 注入任务详情与触发器:将自定义JobDetail和Trigger注入Spring容器,里面包含cron表达式

【演示】

  1. Spring Boot中使用quartz定时任务,见附件项目springboot-schedule-quartz

XXL-JOB

概述

  • 一个高效、易用、灵活的分布式调度平台,开箱即用,且开源、易扩展

  • 任务调度中心执行器,能做到完全与业务分离,适合企业众多业务系统对任务调度都有需要的场景

  • 数据落地到数据库,还提供重试等机制

  • 完全基于Spring Boot技术开源项目,GitHub的Star超过25k

  • 特点:独立、易用、中立、平台化;与实际项目解耦,不受单个项目终止影响,满足企业实际需要

  • 官网:https://www.xuxueli.com/xxl-job/

  • 业务示意图如下

 

XXL-JOB业务示意图

使用步骤

准备.下载官方源代码及文档,地址为https://www.xuxueli.com/xxl-job/

  1. 部署XXL-JOB数据库,创建一个xxl_job的数据库,并使用官方提供的脚本doc\db\tables_xxl_job.sql初始数据库结构

  2. 部署XXL-JOB调度中心

    1. 使用开源代码xxl-job-admin项目

    2. 将application.properties中数据库连接改成第1步部署的数据库,并可配置访问端口

    3. 启动项目,然后通过http://ip:端口/xxl-job-admin/访问,初始用户名和密码为admin和123456

  3. 部署XXL-JOB执行器

    1. 使用开源代码xxl-job-executor-samples/xxl-job-executor-sample-springboot

    2. 将application.properties中xxl.job.admin.addresses指向调度中心地址,并可配置访问端口

    3. 启动项目,执行器自身会开启一个9999的端口给调度中心调用

  4. 业务服务中使用XXL-JOB,多个业务服务就能直接使用第2步调度中心的API新建定时任务、停止定时任务;使用大概过程如下

    1. 添加XXL-JOB任务调度中心地址配置,在application.properties中添加配置

      #【使用XXL-JOB】1、添加XXL-JOB任务调度中心地址配置
      #调度中心地址
      xxl.job.admin.address=http://localhost:8080/xxl-job-admin
      #用户名
      xxl.job.admin.user_name=admin
      #密码
      xxl.job.admin.password=123456
      #接入系统名称
      xxl.job.system.name=order-system
    2. 封装XXL-JOB调用工具类,通过使用RestTemplate对XXL-JOB任务调度中心API的调用,往XXL-JOB任务调度中心添加定时任务、删除定时任务;具体见附件项目中的util.XxlJobUtil类

      • 添加定时任务方法addJob,主要传入参数为cron、定时执行的回调URL,返回参数中包含定时任务id,一般要与业务数据关联

      • 停止定时任务方法stopJob,主要传入参数为定时任务id,停止指定业务数据关联的定时任务

      • 获取登录票据方法getLoginInfo,使用XXL-JOB任务调度中心的登录功能获取登录票据

    3. 使用XXL-JOB调用工具类,在业务中,就可以使用封装的XXL-JOB工具类创建定时任务、停止定时任务;具体见附件代码中的controller.OrderController类、controller.OrderCallbackController类

【演示】

  1. Spring Boot中使用XXL-JOB,模拟一个订单下单等待支付、主动支付关闭订单、支付超时关闭订单业务场景,见附件项目xxl-job-2.4.0、springboot-schedule-xxl-job

代码

网盘地址:链接:https://pan.baidu.com/s/1Jkzxt1-GGZ-GNp_VQ2C9SA?pwd=8888 

标签:Spring,Boot,job,JOB,任务,定时,xxl,入坑,XXL
From: https://www.cnblogs.com/sangrei/p/18239428

相关文章

  • java springboot 网页时装购物系统在线网上平台网站程序源代码+论文
    !!!有需要的小伙伴可以通过文章末尾名片咨询我哦!!! ......
  • Java项目源码文案PPT讲解基于springboot框架的酒店管理
    !!!有需要的小伙伴可以通过文章末尾名片咨询我哦!!! ......
  • Spring Boot集成 Geodesy讲解
    目录1Geodesy1.1什么是geodesy1.2操作实践1.2.1pom.xml1.2.2数学公式计算类1.2.3库包调用1.2.4测试1Geodesy1.1什么是geodesy浩瀚的宇宙中,地球是我们赖以生存的家园。自古以来,人类一直对星球上的位置和彼此的距离着迷。无论是航海探险、贸易往来还是科学研究,精确计算......
  • zz Spring 是一种反模式
    Java将会消亡–MartinVysny–第一性原理思考原文标题“Java将会消亡”,我并不认可Java会消亡一说,作者还处于FP亢奋期,而我已经从FP回归OO,这个话题有机会再展开。”Spring是一种反模式”是第二节的标题。让我们引用一下原文:Spring是一种反模式正如上面演示的......
  • spring和Mybatis的各种查询
    目录六、MyBatis的各种查询功能6.1、查询一个实体类的对象6.2、查询一个list集合6.3、查询单个数据6.4、查询一条数据为Map集合6.5、查询多条数据为Map集合七、特殊SQL的执行7.1、模糊查询7.2、批量删除7.3、动态设置表名7.4、添加功能获取自增的主键八、自定义映射resultMap一......
  • springboot启动过程、自动装配原理、内置Tomcat启动原理
    一、springboot的启动原理springboot的启动通过在main方法的SpringApplication.run()方法启动@SpringBootApplicationpublicclassShuaApplication{publicstaticvoidmain(String[]args){SpringApplication.run(ShuaApplication.class,args);}}......
  • SpringBoot架构图
    文章目录前言一、SpringBoot架构模块二、SpringBoot架构图总结前言提示:这里可以添加本文要记录的大概内容:例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。提示:以下是本篇文章正文内容,下面案......
  • Java项目-基于springboot+vue的音乐网站与分享平台 (源码+数据库+文档)​
    如需完整项目,请私信博主基于SpringBoot+Vue的音乐网站与分享平台开发语言:Java数据库:MySQL技术:SpringBoot+MyBatis+Vue.js工具:IDEA/Ecilpse、Navicat、Maven音乐网站与分享平台的主要使用者分为管理员和用户,实现功能包括管理员:首页、个人中心、用户管理、音乐资讯管理、音乐......
  • Java项目-基于springboot+vue的影城管理系统 (源码+数据库+文档)​
    如需完整项目,请私信博主基于SpringBoot+Vue的影城管理系统开发语言:Java数据库:MySQL技术:SpringBoot+MyBatis+Vue.js工具:IDEA/Ecilpse、Navicat、Maven影城管理系统的主要使用者分为管理员和用户,实现功能包括管理员:首页、个人中心、用户管理、电影类型管理、放映厅管理、电影......
  • Springboot计算机毕业设计疫情下的社区居民管理系统小程序【附源码】开题+论文+mysql+
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景在新冠疫情的影响下,社区管理面临着前所未有的挑战。疫情的快速传播要求社区具备更高效、更精准的管理手段,以保障居民的健康与安全。传统的社区管理方......