From b735c95879643196ffdd69f387cfe9ae2122b3c2 Mon Sep 17 00:00:00 2001 From: hongawen <83944980@qq.com> Date: Wed, 15 Jul 2026 02:57:32 +0100 Subject: [PATCH] =?UTF-8?q?fix(mq-starter-core):=20=E5=8D=95=E6=9D=A1?= =?UTF-8?q?=E7=9B=91=E5=90=AC=E5=99=A8=E6=98=BE=E5=BC=8F=20batchTimeoutMs?= =?UTF-8?q?=3D0/=E8=B4=9F=E6=95=B0=E4=B8=8D=E5=86=8D=E8=AF=AF=E6=8A=A5=20W?= =?UTF-8?q?ARN?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit review 发现 #2:软校验只判 != 60_000,而注解文档明确"0 或负数 = 关闭超时 刷出"。单条监听器显式写 0 语义无害,却触发"配置不生效"WARN 误导运维。 修复:WARN 条件补 batchTimeoutMs > 0,显式关闭(0/负数)不再告警。 Co-Authored-By: Claude Fable 5 --- .../MqListenerAnnotationBeanPostProcessor.java | 5 +++-- .../njcn/mq/container/MqListenerScanTest.java | 18 ++++++++++++++++++ 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/mq-starter-core/src/main/java/com/njcn/mq/container/MqListenerAnnotationBeanPostProcessor.java b/mq-starter-core/src/main/java/com/njcn/mq/container/MqListenerAnnotationBeanPostProcessor.java index cf03222..8fddce4 100644 --- a/mq-starter-core/src/main/java/com/njcn/mq/container/MqListenerAnnotationBeanPostProcessor.java +++ b/mq-starter-core/src/main/java/com/njcn/mq/container/MqListenerAnnotationBeanPostProcessor.java @@ -47,8 +47,9 @@ public class MqListenerAnnotationBeanPostProcessor implements BeanPostProcessor } else if (batch && meta.batchSize() <= 1) { log.warn("[mq] @MqListener 首参为 List 但 batchSize={},将按 1 条一批回调(如需攒批请设置 batchSize>1): {}", meta.batchSize(), m); } - // batchTimeoutMs 仅批量攒批时有意义;已知局限:显式写 60000(恰为缺省值)检测不出,可接受。 - if (meta.batchSize() <= 1 && meta.batchTimeoutMs() != 60_000) { + // batchTimeoutMs 仅批量攒批时有意义;0/负数 = 显式关闭超时,任何监听器上都无害不告警。 + // 已知局限:显式写 60000(恰为缺省值)检测不出,可接受。 + if (meta.batchSize() <= 1 && meta.batchTimeoutMs() != 60_000 && meta.batchTimeoutMs() > 0) { log.warn("[mq] @MqListener batchTimeoutMs={} 仅对批量监听器(batchSize>1)生效,当前 batchSize={} 下不生效: {}", meta.batchTimeoutMs(), meta.batchSize(), m); } diff --git a/mq-starter-core/src/test/java/com/njcn/mq/container/MqListenerScanTest.java b/mq-starter-core/src/test/java/com/njcn/mq/container/MqListenerScanTest.java index dea9620..905c370 100644 --- a/mq-starter-core/src/test/java/com/njcn/mq/container/MqListenerScanTest.java +++ b/mq-starter-core/src/test/java/com/njcn/mq/container/MqListenerScanTest.java @@ -127,4 +127,22 @@ class MqListenerScanTest { bpp.postProcessAfterInitialization(new BatchWithCustomTimeout(), "biz"); assertEquals(0, warnCount(), "批量监听器配 batchTimeoutMs 属正常用法,不应 WARN"); } + + static class TimeoutOffZeroOnSingle { + @MqListener(topic = "W5", group = "wg5", batchTimeoutMs = 0) + public void onOne(String msg) { } + } + + static class TimeoutOffNegativeOnSingle { + @MqListener(topic = "W6", group = "wg6", batchTimeoutMs = -1) + public void onOne(String msg) { } + } + + @Test + void scan_batchTimeoutOffOnSingleListener_noWarn() { + MqListenerAnnotationBeanPostProcessor bpp = new MqListenerAnnotationBeanPostProcessor(); + bpp.postProcessAfterInitialization(new TimeoutOffZeroOnSingle(), "biz1"); + bpp.postProcessAfterInitialization(new TimeoutOffNegativeOnSingle(), "biz2"); + assertEquals(0, warnCount(), "0/负数 = 关闭超时,单条监听器显式关闭语义无害,不应误报 WARN"); + } }