From e51201134a9fea4e1b1a488e1936ea111d64848a Mon Sep 17 00:00:00 2001 From: chenxing Date: Thu, 22 Oct 2026 10:33:48 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20FcAnswerConsumer=20=E6=9D=A1=E4=BB=B6?= =?UTF-8?q?=E5=8C=96(=E9=85=8D=20rabbitmq.host=20=E6=89=8D=E8=A3=85?= =?UTF-8?q?=E9=85=8D)=E2=80=94=E2=80=94=E6=9C=AA=E9=85=8D=20broker=20?= =?UTF-8?q?=E6=97=B6=20@RabbitListener=20=E5=9B=A0=E5=AE=B9=E5=99=A8?= =?UTF-8?q?=E5=B7=A5=E5=8E=82=E7=BC=BA=E5=A4=B1=E6=89=93=E6=96=AD=E5=90=AF?= =?UTF-8?q?=E5=8A=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit inbox 唯一写入口是 MQ 消费路径,未配 broker 时重报扫描无台账可扫,条件化语义无损;签名收据路径不经过本类。 --- .../svchall/service/impl/FcAnswerConsumer.java | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/yunhai/svchall/service/impl/FcAnswerConsumer.java b/src/main/java/com/yunhai/svchall/service/impl/FcAnswerConsumer.java index 08bd96a..eb336b9 100644 --- a/src/main/java/com/yunhai/svchall/service/impl/FcAnswerConsumer.java +++ b/src/main/java/com/yunhai/svchall/service/impl/FcAnswerConsumer.java @@ -26,9 +26,13 @@ import java.util.List; /** * v2 快照消费者(answer-delivery-v2 §7,TASK_2 B.5/B.6)。 * - *

本类由 {@link FcAnswerMqConfiguration} 在已配置 broker 时才绑上监听容器; - * 未接 MQ 的环境里它只是"没人投递的一个 bean",但投影链仍可用——可信建件的第二条路径 - * (签名收据确认)不依赖 broker,这也是本机联调能跑通全链的原因。

+ *

本类整体条件装配:只有显式配了 {@code spring.rabbitmq.host} 才存在(与 + * {@link FcAnswerMqConfiguration} 同一条件表达式)。未接 MQ 的环境里 bean 不创建, + * {@code @RabbitListener} 端点自然不被注册——"MQ 可选"必须落到启动期:注解处理器在 + * 容器工厂缺失时会直接抛 {@code NoSuchBeanDefinitionException} 打断启动,不会优雅跳过。 + * 重报扫描随之停摆是安全的:{@code fc_answer_inbox} 的唯一写入口是 {@code #onMessage} + * (经 {@code AnswerProjectionStore#applySnapshot}),没消费就没台账,扫描没有可做的事; + * 可信建件的第二条路径(签名收据确认)不经过本类。

* *

三条 ack 纪律:

*
    @@ -44,6 +48,8 @@ import java.util.List; */ @Slf4j @Component +@org.springframework.boot.autoconfigure.condition.ConditionalOnExpression( + "!'${spring.rabbitmq.host:}'.trim().isEmpty()") public class FcAnswerConsumer { private final AnswerProjectionStore projectionStore;