v3.1.2026.0601 新增 F052~F058 协议特性:消息压缩可插拔(ZLIB/LZ4/ZSTD)、gRPC 优先级消息、ACL 2.0、LMQ 轻量队列、gRPC PushConsumer;支持 RocketMQ 5.5.0+ Lite Topic 动态创建(F057);新增 Producer/Consumer 消息钩子注册方法;修复 MessageExt 解压 Body 错误;新增 Windows 一键安装脚本大石头 authored at 2026-06-01 22:00:10
diff --git a/ChangeLog.md b/ChangeLog.md
index 263c570..511e25d 100644
--- a/ChangeLog.md
+++ b/ChangeLog.md
@@ -1,5 +1,35 @@
# 更新日志
+## v3.1.2026.0601 (2026-06-01)
+
+### RocketMQ 5.x 协议增强(F052~F058)
+- **消息压缩可插拔**:实现 ZLIB/LZ4/ZSTD 压缩接口,支持按需注册压缩算法
+- **gRPC 优先级消息**:gRPC 通道支持消息优先级发送
+- **ACL 2.0 权限模型**:新增 ACL 2.0 权限验证支持,对齐 RocketMQ 最新安全规范
+- **Pop 不递增重试次数**:修正 Pop 消费时错误累加重试次数的行为,精确控制消费重试语义
+- **LMQ 轻量队列**:支持 Light Message Queue(LMQ),适用于百万级设备场景
+- **gRPC PushConsumer**:新增 gRPC PushConsumer 主流程与注册表机制
+
+### Lite Topic(F057)
+- **Lite Topic 支持**:新增 `TopicMessageType` 枚举,`MqBase.CreateTopic` 增加 `topicMessageType` 参数,支持 RocketMQ 5.5.0+ Lite Topic 动态创建,兼容旧版 Broker
+
+### 消息钩子机制
+- **MessageTrace Hook**:`Producer`/`Consumer` 新增消息钩子注册方法,支持消息轨迹与拦截扩展
+- **一键安装脚本**:新增 RocketMQ Windows 一键安装启动脚本,自动下载 JDK/RocketMQ 并配置环境,便于本地集成测试
+
+### Bug 修复
+- **[fix]** 修复 `MessageExt` 解压 Body 时的错误
+- **[fix]** 修正批量消息与 IPv6 `SysFlag` 标志位,严格对齐协议规范
+- **[fix]** 补充 `Command.Error` 实现和 `NameClient` 空指针检查
+- **[fix]** 修复 Pull Request 拉取目标查找逻辑
+
+### 测试与质量
+- 新增 42 个单元测试(F052~F058 覆盖),测试用例总数达 519
+- 完善端到端集成测试与 Request-Reply 机制验证
+- 重构测试目录(`Consumer` → `Consumers`,`Producer` → `Producers`)与命名空间对齐
+
+---
+
## v3.0.2026.0501 (2026-05-01)
### 问题修复
diff --git a/NewLife.RocketMQ/NewLife.RocketMQ.csproj b/NewLife.RocketMQ/NewLife.RocketMQ.csproj
index 4a714a8..9eda750 100644
--- a/NewLife.RocketMQ/NewLife.RocketMQ.csproj
+++ b/NewLife.RocketMQ/NewLife.RocketMQ.csproj
@@ -5,7 +5,7 @@
<Description>企业级纯托管 RocketMQ 客户端,双协议支持 Remoting 4.x/5.x 和 gRPC 5.x Proxy,零外部依赖,无需 Java、gRPC、Protobuf 第三方库,统一适配阿里云、华为云、腾讯云及 Apache ACL,完整企业级特性(消费重试、死信队列、事务消息、顺序消费、Pop 消费),十亿级项目验证</Description>
<Company>新生命开发团队</Company>
<Copyright>©2002-2026 新生命开发团队</Copyright>
- <VersionPrefix>3.0</VersionPrefix>
+ <VersionPrefix>3.1</VersionPrefix>
<VersionSuffix>$([System.DateTime]::Now.ToString(`yyyy.MMdd`))</VersionSuffix>
<Version>$(VersionPrefix).$(VersionSuffix)</Version>
<FileVersion>$(Version)</FileVersion>
@@ -30,7 +30,7 @@
<RepositoryUrl>https://github.com/NewLifeX/NewLife.RocketMQ</RepositoryUrl>
<RepositoryType>git</RepositoryType>
<PackageTags>新生命团队;X组件;NewLife;RocketMQ;纯托管;零依赖;Remoting;gRPC;阿里云;华为云;腾讯云;消息队列;MQ;分布式;事务消息;延迟消息;顺序消息;死信队列;$(AssemblyName)</PackageTags>
- <PackageReleaseNotes>修复Pop/Ack/ChangeInvisibleTime操作缺少queueId参数导致服务端异常;新增MessageExt便利方法简化消息属性访问;升级基础组件</PackageReleaseNotes>
+ <PackageReleaseNotes>新增 F052~F058 协议特性:消息压缩可插拔(ZLIB/LZ4/ZSTD)、gRPC 优先级消息、ACL 2.0、LMQ 轻量队列、gRPC PushConsumer;支持 RocketMQ 5.5.0+ Lite Topic 动态创建(F057);新增 Producer/Consumer 消息钩子注册方法;修复 MessageExt 解压 Body 错误;新增 Windows 一键安装脚本</PackageReleaseNotes>
<PackageLicenseExpression>MIT</PackageLicenseExpression>
<PublishRepositoryUrl>true</PublishRepositoryUrl>
<EmbedUntrackedSources>true</EmbedUntrackedSources>
@@ -40,7 +40,7 @@
</PropertyGroup>
<ItemGroup>
- <PackageReference Include="Microsoft.SourceLink.GitHub" Version="10.0.203">
+ <PackageReference Include="Microsoft.SourceLink.GitHub" Version="10.0.300">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
@@ -62,7 +62,7 @@
</ItemGroup>
<ItemGroup>
- <PackageReference Include="NewLife.Core" Version="11.15.2026.501" />
+ <PackageReference Include="NewLife.Core" Version="11.16.2026.601" />
</ItemGroup>
</Project>
diff --git a/XUnitTestRocketMQ/Producers/RequestReplyTests.cs b/XUnitTestRocketMQ/Producers/RequestReplyTests.cs
index 5e33b51..f7ad8ce 100644
--- a/XUnitTestRocketMQ/Producers/RequestReplyTests.cs
+++ b/XUnitTestRocketMQ/Producers/RequestReplyTests.cs
@@ -60,12 +60,12 @@ public class RequestReplyTests
consumer.Start();
- // 等待消费者完成 Rebalance 并开始拉取
- Thread.Sleep(5000);
+ // 等待消费者完成 Rebalance 并开始拉取(Rebalance 通常在 100ms 触发,但首次 Pull 需要建立连接,留 10 秒余量)
+ Thread.Sleep(10000);
// 发送请求并等待响应
var requestBody = "Hello, this is a request!";
- var response = producer.Request(requestBody, 10000);
+ var response = producer.Request(requestBody, 30000);
Assert.NotNull(response);
Assert.Contains("Reply to:", response.BodyString);
@@ -120,12 +120,12 @@ public class RequestReplyTests
consumer.Start();
- // 等待消费者完成 Rebalance 并开始拉取
- await Task.Delay(5000);
+ // 等待消费者完成 Rebalance 并开始拉取(Rebalance 通常在 100ms 触发,但首次 Pull 需要建立连接,留 10 秒余量)
+ await Task.Delay(10000);
// 异步发送请求并等待响应
var requestBody = "Hello, this is an async request!";
- var response = await producer.RequestAsync(requestBody, 10000).ConfigureAwait(false);
+ var response = await producer.RequestAsync(requestBody, 30000).ConfigureAwait(false);
Assert.NotNull(response);
Assert.Contains("Async Reply to:", response.BodyString);
diff --git a/XUnitTestRocketMQ/XUnitTest.csproj b/XUnitTestRocketMQ/XUnitTest.csproj
index 5a2e579..6775bf2 100644
--- a/XUnitTestRocketMQ/XUnitTest.csproj
+++ b/XUnitTestRocketMQ/XUnitTest.csproj
@@ -13,15 +13,15 @@
</ItemGroup>
<ItemGroup>
- <PackageReference Include="Microsoft.NET.Test.Sdk" Version="18.5.1" />
+ <PackageReference Include="Microsoft.NET.Test.Sdk" Version="18.6.0" />
<PackageReference Include="Moq" Version="4.20.72" />
<PackageReference Include="xunit" Version="2.9.3" />
- <PackageReference Include="Xunit.SkippableFact" Version="1.5.23" />
+ <PackageReference Include="Xunit.SkippableFact" Version="1.5.61" />
<PackageReference Include="xunit.runner.visualstudio" Version="3.1.5">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
- <PackageReference Include="coverlet.collector" Version="10.0.0">
+ <PackageReference Include="coverlet.collector" Version="10.0.1">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>