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"); + } }