Skip to content

Feat/replace spring event with rabbitmq#210

Open
maixiaowen111 wants to merge 5 commits into
rymcu:masterfrom
maixiaowen111:feat/replace-spring-event-with-rabbitmq
Open

Feat/replace spring event with rabbitmq#210
maixiaowen111 wants to merge 5 commits into
rymcu:masterfrom
maixiaowen111:feat/replace-spring-event-with-rabbitmq

Conversation

@maixiaowen111

Copy link
Copy Markdown

🐰 将 Spring Event 替换为 RabbitMQ 消息队列

动机

当前项目使用 Spring Event + @TransactionalEventListener 处理异步任务(Lucene 索引更新、通知推送等),存在以下问题:

  • 紧耦合:发布者和消费者在同一 JVM 进程内
  • 不可重试:消费失败直接丢失
  • 不可监控:无法查看消息积压情况
  • 不可扩展:消费者无法独立部署

改动内容

  • ✅ 添加 spring-boot-starter-amqp 依赖
  • ✅ 新增 RabbitMQConfig:1 个 Exchange + 5 个 Queue + 7 个 Binding
  • ✅ 新增 EventPublisher:TransactionSynchronization.afterCommit() 保证事务后投递
  • ✅ 替换 8 处 ApplicationEventPublisher.publishEvent() → EventPublisher.publish()
  • ✅ 替换 5 个 Handler 的 @TransactionalEventListener → @RabbitListener
  • ✅ 事件 POJO 类无需修改,业务逻辑零改动
  • ✅ 支持消息重试(max-attempts=3)

架构对比

改造前:Service → ApplicationEventPublisher → @TransactionalEventListener (同步/同进程)
改造后:Service → RabbitMQ Exchange → Queue → @RabbitListener (异步/解耦/可重试)

测试方法

  1. 启动 RabbitMQ:docker run -d -p 5672:5672 rabbitmq:3-management
  2. 发布文章 → 检查 Lucene 索引更新
  3. 发表评论 → 检查通知推送
  4. 关注用户 → 检查通知
  5. 登录 → 检查最后在线时间更新

新增 spring-boot-starter-amqp 依赖、交换机/队列配置、EventPublisher 核心发布器

- RabbitMQConfig: 1 个 Exchange + 5 个 Queue + 7 个 Binding
- EventPublisher: TransactionSynchronization.afterCommit 保证事务后投递
- application.yml: RabbitMQ 连接配置 + 消费重试
8 处 publishEvent() 改为 eventPublisher.publish(),利用事务同步保证消息投递

- ArticleServiceImpl: 3 处替换(发布/删除/状态变更)
- CommentServiceImpl: 1 处替换
- FollowServiceImpl: 1 处替换
- PortfolioServiceImpl: 2 处替换(增改/删除)
- RedisTokenManager: 1 处替换(非事务直接发送)
5 个 Handler 改为 RabbitMQ 消费,业务逻辑保持不变

- ArticleHandler: 统一入口 + instanceof 分发 3 种事件类型
- CommentHandler/FollowHandler/AccountHandler/PortfolioHandler: 1:1 替换
修复 CI FOSSA 许可证合规检查,本次改动涉及的 6 个包中
所有 .java 文件现在均包含 Copyright (c) 2020 RYMCU MIT 声明

影响包:config / event / handler / handler/event / service/impl / auth
@maixiaowen111
maixiaowen111 force-pushed the feat/replace-spring-event-with-rabbitmq branch from 93c4aa9 to 9302ac6 Compare July 10, 2026 10:37
修复 CI FOSSA 许可证合规检查剩余的 26 个问题
src/test/ 下所有 Java 测试文件现在包含 Copyright (c) 2020 RYMCU MIT 声明
@maixiaowen111

maixiaowen111 commented Jul 10, 2026

Copy link
Copy Markdown
Author

@ronger-x
▎ 关于 FOSSA 许可证扫描失败的说明

▎ 经排查,26 处违规非本次 RabbitMQ 改动引入:
▎ - spring-boot-starter-amqp 及其传递依赖(spring-rabbit、amqp-client)均为 Apache 2.0 / MPL 2.0,与项目 MIT 协议兼容
▎ - FOSSA 报出的 GPL v2 来自项目原有的 mysql-connector-j(MySQL 官方驱动),以及其他既有依赖(BSD、CDDL
▎ 等),并非本次新增
▎ - 源码文件版权头已全部补齐(56 个 main + 26 个 test)

▎ 建议在 FOSSA 后台将已有依赖的协议问题配置为例外规则,或确认是否需要我将 MySQL 驱动替换为 LGPL 的 MariaDB 驱动(另开
▎ PR处理)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant