refactor(artemis): 移除 embedded 模式,恢复 netty 4.2 修复 Linux Lettuce 崩溃

根 pom 删 netty.version=4.1.135 覆盖,恢复 Boot 4.1 默认 netty 4.2.15;
common-artemis 删 artemis-jms-server 依赖(fat jar 不再含 EmbeddedActiveMQ,
Spring Boot @ConditionalOnClass 自动跳过 embedded 装配);
application-dev/prod.yml 删 spring.artemis.embedded 段,mode 固定 native。

根因:netty 4.1 降级曾为修 JDK25+Artemis embedded 的 CleanerJava25 崩溃,
但 Lettuce 7.5.2 针对 netty 4.2 编译,Linux epoll 路径引用
MultiThreadIoEventLoopGroup(4.2 新基类)致 NoClassDefFoundError;
移除 embedded 消除 CleanerJava25 触发点后 netty 恢复 4.2,Lettuce 正常。
This commit is contained in:
daxpay
2026-08-11 23:04:45 +08:00
parent 677a9541e9
commit 78fa28ae24
4 changed files with 17 additions and 39 deletions

View File

@@ -24,13 +24,6 @@
<groupId>org.messaginghub</groupId>
<artifactId>pooled-jms</artifactId>
</dependency>
<!-- 嵌入式 Artemis server提供 EmbeddedActiveMQ + Configuration
常驻 fat jar使 spring.artemis.mode=embedded 可用mode=native 时本依赖不被装配路径触发。
版本由 Spring Boot BOM 管理。 -->
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>artemis-jms-server</artifactId>
</dependency>
<!-- JSON 序列化 -->
<dependency>
<groupId>cn.daxpay.open</groupId>

View File

@@ -34,23 +34,18 @@ spring:
lettuce:
pool:
max-wait: 1000ms
# Artemis 消息队列(双模式:native=外置容器 / embedded=内嵌 JVM
# 本地开发默认 embedded无需启动独立 artemis 容器broker 内嵌后端 JVM
# 如需连外部 broker联调 docker artemis设环境变量
# ARTEMIS_MODE=native + ARTEMIS_BROKER_URL/USER/PASSWORD
# Artemis 消息队列native 模式:连接外部独立 broker 容器,不再支持内嵌模式
artemis:
mode: ${ARTEMIS_MODE:embedded}
broker-url: ${ARTEMIS_BROKER_URL:tcp://192.168.1.229:61616}
user: ${ARTEMIS_USER:admin}
password: ${ARTEMIS_PASSWORD:admin}
mode: native
# Broker 连接地址
broker-url: tcp://192.168.1.229:61616
# broker 账号(与容器启动环境变量一致)
user: admin
password: admin
pool:
enabled: true
max-connections: 10
idle-timeout: 30s
embedded:
enabled: true
persistent: true
data-directory: ${ARTEMIS_DATA_DIR:./data/artemis}
jms:
# 会话缓存,提升发送性能
cache:

View File

@@ -40,25 +40,17 @@ spring:
lettuce:
pool:
max-wait: 1000ms
# Artemis 消息队列(双模式:native=外置容器 / embedded=内嵌 JVM
# 切换:环境变量 ARTEMIS_MODE=native|embedded默认 native无需改代码、不重打包
# - native连接独立 artemis 容器(标准部署),需 ARTEMIS_USER/PASSWORDinstaller 注入)
# - embeddedbroker 内嵌后端 JVM内存紧张场景省独立 JVM无需凭证journal 落 ARTEMIS_DATA_DIR
# Artemis 消息队列native 模式:连接外部独立 broker 容器,不再支持内嵌模式
# 凭证与地址由 installer 注入ARTEMIS_BROKER_URL / ARTEMIS_USER / ARTEMIS_PASSWORD
artemis:
mode: ${ARTEMIS_MODE:native}
mode: native
broker-url: ${ARTEMIS_BROKER_URL:tcp://artemis:61616}
# 凭证空串兜底embedded 模式不传也不报错native 模式由 installer 注入真实值
user: ${ARTEMIS_USER:}
password: ${ARTEMIS_PASSWORD:}
pool:
enabled: true
max-connections: 20
idle-timeout: 30s
embedded:
enabled: true
# 持久化:支付超时 / 通知消息重启不丢journal 落盘)
persistent: true
data-directory: ${ARTEMIS_DATA_DIR:./data/artemis}
jms:
cache:
enabled: true

16
pom.xml
View File

@@ -57,15 +57,13 @@
<ip2region.version>3.3.7</ip2region.version>
<wxjava.version>4.8.4.B</wxjava.version>
<commonmark.version>0.24.0</commonmark.version>
<!-- Netty 版本覆盖JDK 25 兼容修复):
Boot 4.1 BOM 默认 netty 4.2.15,其 CleanerJava25 对"任意 direct ByteBuffer"无法手动清理,
直接抛 UnsupportedOperationException: Cannot clean arbitrary ByteBuffer instances
Artemis 内嵌 brokerembedded 模式)加载 NIO journal 时调用
NIOSequentialFileFactory.releaseDirectBuffer 未捕获该异常 → 启动失败AMQ224000
4.1.135 与 Artemis 2.53 官方声明的 4.1.x 同系CleanerJava9 在 JDK 25 上可正常清理
invokeCleaner 仍存在,仅 deprecated且降级链优雅不支持时 NOOP不会抛异常
注意JDK 26 移除 invokeCleaner 后需再随 Artemis 官方升级同步处理。 -->
<netty.version>4.1.135.Final</netty.version>
<!-- Netty:用 Boot 4.1 BOM 默认4.2.x不覆盖。
曾为 embedded Artemis 降到 4.1.135netty 4.2 CleanerJava25 在 JDK25 上对 NIO journal
direct ByteBuffer 抛 UnsupportedOperationException → AMQ224000但 4.1 缺少
io.netty.channel.MultiThreadIoEventLoopGroupnetty 4.2 重构后的新基类),导致 Lettuce 7.x
Boot 4.1 自带 Redis 客户端)运行时 NoClassDefFoundError —— 走 Redis 的路径(如 shedlock
定时任务抢锁全炸。embedded 模式与 Lettuce 在 JDK25 不可共存,已弃用回 native 独立容器。
若未来重启 embedded须先确认 Artemis 兼容 netty 4.2。 -->
</properties>
<build>