【面试中的分布式定时任务】

定时任务与分布式定时任务框架XXL-JOB详解

一、为什么需要定时任务?

定时任务在业务场景中非常常见,主要用于以下场景:

  1. 时间驱动处理
    • 整点发送优惠券
    • 每天更新收益
    • 每天刷新标签数据和人群数据

  2. 批量处理数据
    • 按月批量统计报表数据
    • 批量更新短信状态
    • 实时性要求不高的数据处理

  3. 异步执行解耦
    • 活动状态刷新
    • 数据同步
    • 异步执行离线查询,与内部逻辑解耦

二、定时任务的实现方式

定时任务的实现方式有多种,以下是常见的几种:

  1. JDK方式
    • 死循环
    • Timer定时器
    • JUC定时任务

  2. Spring Scheduling声明式定时任务
    @EnableScheduling
    @Scheduled

  3. 经典定时任务框架
    • Quartz

  4. 分布式定时任务
    • XXL-JOB(基于Quartz)
    • Elastic-Job(基于Quartz)
    • Saturn(Elastic-Job的Fork版本)

  5. MQ延时队列

三、各解决方案的优缺点

  1. JDK方式及Spring Scheduling
    • 优点:简单易用
    • 缺点:不支持高可用,不支持动态配置

  2. Quartz
    • 优点:支持高可用
    • 缺点:配置复杂(需要10几张表),不支持动态配置

  3. XXL-JOB
    • 优点:支持高可用,动态配置,任务统一管理
    • 缺点:需要额外部署调度中心

四、分布式定时任务框架XXL-JOB

XXL-JOB是一个分布式任务调度平台,核心设计目标是开发迅速、学习简单、轻量级、易扩展。目前已有多家公司接入,包括大众点评、京东、优信二手车等。

4.1 项目结构

XXL-JOB支持通过Web页面对任务进行CRUD操作,支持动态修改任务状态、暂停/恢复任务,以及终止运行中任务。

源码地址:
• GitHub:https://github.com/xuxueli/xxl-job
• 码云:http://gitee.com/xuxueli0323/xxl-job

项目结构如下:

xxl-job-admin:调度中心
xxl-job-core:公共依赖
xxl-job-executor-samples:执行器示例
xxl-job-executor-sample-springboot:SpringBoot版本(推荐)
xxl-job-executor-sample-spring:Spring版本
xxl-job-executor-sample-frameless:无框架版本
• 其他版本:JFinal、Nutz、jboot等

4.2 设计思想

XXL-JOB将调度行为抽象为“调度中心”,调度中心负责发起调度请求,而任务逻辑由“执行器”处理。调度中心与执行器解耦,提高了系统的稳定性和扩展性。

4.3 部署调度中心

4.3.1 初始化调度数据库

执行tables_xxl_job.sql脚本初始化数据库。调度中心支持集群部署,集群节点需连接同一个MySQL实例。

4.3.2 修改调度中心配置

配置文件路径:xxl-job/xxl-job-admin/src/main/resources/application.properties
主要配置项:
• 端口号
• JDBC数据源
• 报警邮箱
• 调度中心通讯TOKEN

4.3.3 打包运行调度中心
  1. 编译打包:mvn clean package -Dmaven.skip.test=true
  2. 启动调度中心:java -jar xxl-job-admin-2.2.0.jar
  3. 访问调度中心:http://localhost:8080/xxl-job-admin

默认登录账号:admin/123456

4.3.4 调度中心集群(可选)

调度中心支持集群部署,提升系统的容灾和可用性。集群部署时需保证DB配置一致,机器时钟一致。

4.4 搭建执行器项目

执行器负责接收调度中心的调度并执行任务。可以将执行器集成到现有项目中,也可以直接使用示例项目。

4.4.1 添加XXL-JOB依赖
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency><groupId>com.xuxueli</groupId><artifactId>xxl-job-core</artifactId><version>2.2.0</version>
</dependency>
4.4.2 修改执行器配置

配置文件路径:xxl-job-executor-sample-springboot/src/main/resources/application.properties
主要配置项:
• 调度中心地址
• 执行器AppName
• 执行器端口号
• 日志存储路径

4.4.3 添加执行器配置类

Copy示例工程的配置文件到项目中,无需修改。

4.4.4 给执行器添加任务
@Component
public class MyJobHandler {@XxlJob("myJobHandler")public ReturnT<String> execute(String param) {XxlJobLogger.log("任务执行日志");System.out.println("任务执行:" + param);return ReturnT.SUCCESS;}
}
4.4.5 执行器管理

在调度中心“执行器管理”界面添加执行器,支持自动注册和手动录入。

4.5 任务界面详解

任务配置项包括:
• 执行器
• 任务描述
• 路由策略
• Cron表达式
• 运行模式(BEAN模式、GLUE模式)
• 阻塞处理策略
• 子任务
• 任务超时时间
• 失败重试次数
• 报警邮件
• 负责人
• 执行参数

4.6 分片广播任务

分片广播任务适用于大数据量处理场景,如分片任务、广播任务等。任务会广播到所有执行器,执行器根据分片参数处理数据。

@JobHandler(value="shardingJobHandler")
@Service
public class ShardingJobHandler extends IJobHandler {@Overridepublic ReturnT<String> execute(String param) {ShardingUtil.ShardingVO shardingVO = ShardingUtil.getShardingVo();XxlJobLogger.log("分片参数:当前分片序号 = {}, 总分片数 = {}", shardingVO.getIndex(), shardingVO.getTotal());return SUCCESS;}
}

五、使用XXL-JOB改造购物车数据同步

5.1 异步执行失败记录到Redis

改造CartAsyncExceptionHandler,将异常用户记录到Redis。

@Slf4j
@Component
public class CartAsyncExceptionHandler implements AsyncUncaughtExceptionHandler {@Autowiredprivate StringRedisTemplate redisTemplate;private static final String KEY = "cart:async:exception";@Overridepublic void handleUncaughtException(Throwable throwable, Method method, Object... objects) {log.error("异步调用发生异常,方法:{},参数:{},异常信息:{}", method, objects, throwable.getMessage());String userId = objects[0].toString();BoundListOperations<String, String> listOps = this.redisTemplate.boundListOps(KEY);listOps.leftPush(userId);}
}

5.2 添加任务同步购物车数据

在定时任务工程中引入Redis和Mapper接口,添加CartJobHandler任务。

@Component
public class CartJobHandler {@Autowiredprivate StringRedisTemplate redisTemplate;@Autowiredprivate CartMapper cartMapper;private static final String KEY = "cart:async:exception";private static final String KEY_PREFIX = "cart:info:";@XxlJob("cartJobHandler")public ReturnT<String> executor(String param) {BoundListOperations<String, String> listOps = this.redisTemplate.boundListOps(KEY);String userId = listOps.rightPop();while (StringUtils.isNotBlank(userId)) {this.cartMapper.delete(new UpdateWrapper<Cart>().eq("user_id", userId));BoundHashOperations<String, Object, Object> hashOps = this.redisTemplate.boundHashOps(KEY_PREFIX + userId);List<Object> cartJsons = hashOps.values();if (!CollectionUtils.isEmpty(cartJsons)) {cartJsons.forEach(cartJson -> {this.cartMapper.insert(JSON.parseObject(cartJson.toString(), Cart.class));});}userId = listOps.rightPop();}return ReturnT.SUCCESS;}
}

六、总结

XXL-JOB是一个功能强大、易于使用的分布式任务调度框架,支持高可用、动态配置和任务统一管理。通过XXL-JOB,可以轻松实现定时任务的调度和执行,适用于各种业务场景。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/35660.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

opencv初步学习——图像处理3

这一部分我们将学习opencv中对图像大小进行调整的基本操作&#xff0c;以及掩模操作&#xff0c;我们直接进入正言 一、cv2.resize( )函数 1-1、组成与构造 该函数的作用就算用来帮助我们实现对图像大小的处理&#xff0c;具体的组成与构造如下&#xff1a; cv2.resize(src , …

[LevelDB]关于LevelDB存储架构到底怎么设计的?

本文内容组织形式 LevelDB 存储架构重要特点总体概括LevelDB中内存模型MemTableMemTable的数据结构背景&#xff1a;SkipListSkiplist的数据结构 Skiplist的数据访问细节 SkipList的核心方法Node细节源代码 MemTable的数据加速方式Iterator 的核心方法 MemTable 的读取&写入…

【存储中间件】Redis核心技术与实战(四):Redis高并发高可用(Redis集群 Smart客户端、集群原理)

文章目录 Redis集群Smart客户端smart客户端原理ASK 重定向集群下的Jedis客户端Hash tags 集群原理节点通信通信流程Gossip 消息节点选择 故障转移故障发现主观下线客观下线 故障恢复资格检查准备选举时间发起选举选举投票替换主节点 故障转移时间 集群不可用判定集群读写分离 个…

【接口耗时】⭐️自定义拦截器实现接口耗时统计

&#x1f4a5;&#x1f4a5;✈️✈️欢迎阅读本文章❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;本篇文章阅读大约耗时三分钟。 ⛳️motto&#xff1a;不积跬步、无以千里 &#x1f4cb;&#x1f4cb;&#x1f4cb;本文目录如下&#xff1a;&#x1f381;&#x1f381;&a…

杨校老师课堂之编程入门与软件安装【图文笔记】

亲爱的同学们&#xff0c;热烈欢迎踏入青少年编程的奇妙世界&#xff01; 我是你们的授课老师杨校 &#xff0c;期待与大家一同开启编程之旅。 1. 轻松叩开编程之门 1.1 程序的定义及生活中的应用 程序是人与计算机沟通的工具。在日常生活中&#xff0c;像手机里的各类 APP、电…

【从零开始】Air780EPM的LuatOS二次开发——OneWire协议调试注意事项!

当涉及到与传感器、执行器等外部设备交互时&#xff0c;OneWire协议的高效调试成为决定项目成败的关键环节。OneWire协议&#xff08;单总线协议&#xff09;以其仅需一根数据线即可实现设备通信的极简特性&#xff0c;被广泛应用于温度传感器、身份识别模块等场景。 一、LuatO…

redis数据结构、多路复用、持久化---java

数据结构 Redis 提供了丰富的数据类型&#xff0c;常见的有五种数据类型&#xff1a;String&#xff08;字符串&#xff09;&#xff0c;Hash&#xff08;哈希&#xff09;&#xff0c;List&#xff08;列表&#xff09;&#xff0c;Set&#xff08;集合&#xff09;、Zset&am…

vue3之写一个aichat ----vite.config.js

vite.config.js的CSS配置 postcss-pxtorem 开发响应式网页的时候需要用到postcss-pxtorem amfe-flexible amfe-flexible是由阿里团队开发的一个库&#xff0c;它可以根据设备的屏幕宽度去动态调整HTML根元素()的字体大小&#xff0c;这意味着无论用户使用什么尺寸的设备访问你…

强化学习(赵世钰版)-学习笔记(8.值函数方法)

本章是算法与方法的第四章&#xff0c;是TD算法的拓展&#xff0c;本质上是将状态值与行为值的表征方式&#xff0c;从离散的表格形式&#xff0c;拓展到了连续的函数形式。 表格形式的优点是直观&#xff0c;便于分析&#xff0c;缺点是数据量较大或者连续性状态或者行为空间时…

C++模版(进阶)

文章目录 一、非类型模版参数二、模版的特化2.1 概念2.2 函数模版特化2.2.1 函数模版特化为指针类型注意事项 2.3 类模版特化2.3.1 全特化2.3.2 偏特化(半特化)2.3.3 类模板特化应用示例 三、模版分离编译3.1 什么是分离编译&#xff1f;3.2 模版的分离编译3.3 解决方法! 四、模…

Linux配置yum仓库,服务控制,防火墙

一、yum仓库 1.在安装软件时&#xff0c;首先第一步就是要考虑软件的版本的问题&#xff01; 2.软件的安装&#xff1a;最安全可靠的方法就是去软件对应的官网上查看安装手册&#xff08;包括的软件的下载&#xff09; 红帽系软件安装的常见的3种方式 &#xff08;1&#x…

布谷直播系统源码开发实战:从架构设计到性能优化

作为山东布谷科技的一名技术研发人员&#xff0c;我参与了多个直播系统平台从0到1的开发和搭建&#xff0c;也见证了直播行业从萌芽到爆发的全过程。今天&#xff0c;我想从研发角度&#xff0c;分享一些直播系统软件开发的经验和心得&#xff0c;希望能对大家有所帮助。 一、 …

实战设计模式之解释器模式

概述 作为一种行为设计模式&#xff0c;解释器模式提供了一种方法来定义语言的文法规则&#xff0c;并通过这些规则解析和处理特定类型的语言句子。简单来说&#xff0c;解释器模式允许我们定义一个代表某种语言中语法规则的对象结构&#xff0c;从而能够根据这些规则理解并处理…

物联网边缘计算网关是什么?

在物联网的浩瀚架构中&#xff0c;边缘计算网关宛如一位坚毅的前沿哨兵&#xff0c;默默守护着数据处理与传输的关键防线&#xff0c;为整个物联网系统的高效运转发挥着不可或缺的作用。 一、边缘计算网关的定义与基本功能 边缘计算网关是一种智能设备&#xff0c;它被部署在…

计算机视觉算法实战——障碍物识别(主页有源码)

✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连✨ ​​ ​​​​​​ ​ ​ 1. 引言 计算机视觉是人工智能领域的一个重要分支&#xff0c;旨在通过计算机模拟人类的视觉系统&#xff0c;从…

Win11锁屏后显示“天气、市场、广告”如何取消显示

关闭方法&#xff1a;设置>个性化>锁屏界面>锁屏界面状态>"无"。 方法一&#xff1a;通过“个性化”设置 打开“设置”应用&#xff1a; 点击屏幕左下角的“开始”按钮&#xff08;Windows 图标&#xff09;。点击齿轮状的“设置”图标。或者按下 Win I…

10天速通强化学习-008

TRPO 思考-TRPO-在线策略-给定信任区域防止更新不稳定 Actor-Critic网络随着网络深度的增加&#xff0c;步长太长&#xff0c;梯度更新会变差。改变方法-增加信任区域。(trust region policy optimization)-TRPO算法&#xff1a; 核心思想&#xff1a; 是在每次迭代中&…

整合百款经典街机游戏的模拟器介绍

对于80、90后而言&#xff0c;街机游戏承载着童年的欢乐记忆。今天要给大家介绍一款超棒的软件——「MXui街机厅经典游戏101款」&#xff0c;它能带你重回那段热血沸腾的街机时光。 「MXui街机厅经典游戏101款」是一款绿色免安装的街机模拟器&#xff0c;体积约1.39G。无需繁琐…

springboot第三站(1) web开发引入

目录 1.简介 2.SpringBoot对静态资源的映射规则 3.模版引擎 1.简介 使用SpringBoot&#xff1b; 1&#xff09;、创建SpringBoot应用&#xff0c;选中我们需要的模块&#xff1b; 2&#xff09;、SpringBoot已经默认将这些场景配置好了&#xff0c;只需要在配置文件中指定…

12-二叉树-二叉树高度(给定前序和中序确定二叉树)

题目 来源 23. 二叉树的高度 思路 其实跟09那篇很像&#xff0c;反正核心就是要通过前序和中序来建树&#xff0c;只不过现在多了一个返回值&#xff1b;因为建树的时候&#xff0c;其实左子树和右子树的深度就可以知道。其余详见代码。 代码 /* 前序遍历根左右,中序&…