JEECG-Boot分布式事务最大努力通知模式终极实现指南【免费下载链接】jeecg-bootAI低代码平台支持「低代码 零代码」双模式零代码 5 分钟搭建业务系统低代码模式一键生成前后端代码。 内置AI 应用支持AI聊天、知识库、流程编排、MCP与插件支持各种模型。Skills能力实现一句话画流程图、设计表单、生成系统。 引领 AI生成→在线配置→代码生成→手工合并的开发模式解决Java项目80%的重复工作快速提高效率又不失灵活性。项目地址: https://gitcode.com/GitHub_Trending/je/jeecg-bootJEECG-Boot作为一款AI低代码平台支持「低代码 零代码」双模式能帮助开发者5分钟搭建业务系统一键生成前后端代码。在分布式系统开发中事务一致性是核心挑战之一而最大努力通知模式是解决分布式事务的重要方案。本文将详细介绍如何在JEECG-Boot中实现最大努力通知模式确保分布式事务的最终一致性。什么是最大努力通知模式最大努力通知模式是分布式事务中的一种柔性事务解决方案其核心思想是通过消息队列和重试机制尽可能确保事务的最终一致性。当主业务完成后系统会异步通知从业务如果通知失败会通过定时任务进行多次重试直到达到最大重试次数或从业务确认接收。这种模式适用于对一致性要求不是特别严格但需要尽可能保证数据可靠的场景如订单状态通知、支付结果同步等。JEECG-Boot中的技术支持JEECG-Boot内置了完善的消息队列和定时任务支持为实现最大努力通知模式提供了基础消息队列支持RabbitMQ和RocketMQ可通过jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-rabbitmq/和jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-rocketmq/模块进行测试和集成。定时任务基于XXL-Job实现支持任务调度、失败重试等功能相关表结构定义在jeecg-boot/db/tables_xxl_job.sql中可配置失败重试次数、间隔时间等参数。最大努力通知模式实现步骤1. 设计消息表首先需要设计一张消息表用于存储待发送的通知消息包含消息ID、业务ID、通知状态、重试次数、下次重试时间等字段。示例表结构如下CREATE TABLE t_notify_message ( id bigint(20) NOT NULL AUTO_INCREMENT, message_id varchar(64) NOT NULL COMMENT 消息唯一标识, business_id varchar(64) NOT NULL COMMENT 业务ID, content text NOT NULL COMMENT 消息内容, status tinyint(4) NOT NULL DEFAULT 0 COMMENT 状态0-待发送1-已发送2-发送失败, retry_count int(11) NOT NULL DEFAULT 0 COMMENT 重试次数, next_retry_time datetime DEFAULT NULL COMMENT 下次重试时间, create_time datetime NOT NULL COMMENT 创建时间, PRIMARY KEY (id), UNIQUE KEY uk_message_id (message_id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT通知消息表;2. 发送通知消息在主业务完成后将通知消息存入消息表并发送到消息队列。JEECG-Boot中可通过RabbitMQTemplate或RocketMQTemplate发送消息示例代码如下Service public class OrderService { Autowired private RabbitTemplate rabbitTemplate; Autowired private NotifyMessageMapper notifyMessageMapper; Transactional public void createOrder(Order order) { // 保存订单 orderMapper.insert(order); // 创建通知消息 NotifyMessage message new NotifyMessage(); message.setMessageId(UUID.randomUUID().toString()); message.setBusinessId(order.getId().toString()); message.setContent(JSON.toJSONString(order)); message.setStatus(0); message.setRetryCount(0); message.setCreateTime(new Date()); notifyMessageMapper.insert(message); // 发送消息到队列 rabbitTemplate.convertAndSend(notify.exchange, notify.routing.key, message); } }3. 消费消息并处理从消息队列中消费消息调用从业务接口。如果调用成功更新消息状态为已发送如果失败更新重试次数和下次重试时间。Component public class NotifyMessageConsumer { Autowired private NotifyMessageMapper notifyMessageMapper; Autowired private RemoteService remoteService; RabbitListener(queues notify.queue) public void handleMessage(NotifyMessage message) { try { // 调用远程接口 remoteService.notify(message.getBusinessId(), message.getContent()); // 更新消息状态 message.setStatus(1); notifyMessageMapper.updateById(message); } catch (Exception e) { // 处理失败更新重试信息 message.setRetryCount(message.getRetryCount() 1); message.setNextRetryTime(calculateNextRetryTime(message.getRetryCount())); notifyMessageMapper.updateById(message); } } // 计算下次重试时间采用指数退避策略 private Date calculateNextRetryTime(int retryCount) { long delay (long) (Math.pow(2, retryCount) * 1000); return new Date(System.currentTimeMillis() delay); } }4. 定时任务重试通过XXL-Job定时任务定期扫描消息表中状态为待发送且下次重试时间已到的消息重新发送。Component public class NotifyRetryJob { Autowired private NotifyMessageMapper notifyMessageMapper; Autowired private RabbitTemplate rabbitTemplate; XxlJob(notifyRetryJob) public void execute() { // 查询需要重试的消息 QueryWrapperNotifyMessage queryWrapper new QueryWrapper(); queryWrapper.eq(status, 0) .le(next_retry_time, new Date()) .lt(retry_count, 5); // 最大重试次数 ListNotifyMessage messages notifyMessageMapper.selectList(queryWrapper); for (NotifyMessage message : messages) { // 重新发送消息 rabbitTemplate.convertAndSend(notify.exchange, notify.routing.key, message); } } }关键配置与优化1. 消息队列配置在jeecg-server-cloud/jeecg-cloud-gateway/src/main/resources/application.yml中配置消息队列连接信息spring: rabbitmq: host: localhost port: 5672 username: guest password: guest virtual-host: /2. 定时任务配置在XXL-Job管理界面配置定时任务设置Cron表达式如0 */1 * * * ?表示每分钟执行一次并指定最大重试次数如5次。相关配置可参考jeecg-boot/db/tables_xxl_job.sql中的executor_fail_retry_count字段。3. 重试策略优化采用指数退避策略计算重试间隔避免因网络波动等临时问题导致的频繁重试。如第1次重试间隔1秒第2次2秒第3次4秒以此类推。总结最大努力通知模式是JEECG-Boot中实现分布式事务最终一致性的有效方案通过消息队列、定时任务和重试机制的结合能够在保证系统可用性的同时尽可能确保数据一致性。在实际项目中可根据业务需求调整重试次数、间隔时间等参数以达到最佳效果。JEECG-Boot作为AI低代码平台不仅提供了分布式事务的解决方案还内置了AI聊天、知识库、流程编排等功能引领「AI生成→在线配置→代码生成→手工合并」的开发模式解决Java项目80%的重复工作快速提高开发效率。如果您想了解更多关于JEECG-Boot的功能可以访问项目仓库进行学习和实践git clone https://gitcode.com/GitHub_Trending/je/jeecg-boot。【免费下载链接】jeecg-bootAI低代码平台支持「低代码 零代码」双模式零代码 5 分钟搭建业务系统低代码模式一键生成前后端代码。 内置AI 应用支持AI聊天、知识库、流程编排、MCP与插件支持各种模型。Skills能力实现一句话画流程图、设计表单、生成系统。 引领 AI生成→在线配置→代码生成→手工合并的开发模式解决Java项目80%的重复工作快速提高效率又不失灵活性。项目地址: https://gitcode.com/GitHub_Trending/je/jeecg-boot创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考