Spring Integration处理流程时打印指定INFO日志的具体原因是什么
日志输出的根本原因
- 你配置的
xxx-consolidador-channel-segrega-renda-variavel是Spring Integration默认的单播通道(Point-to-Point Channel),该通道绑定了两个订阅者:- 第一个是id为
recursaoRendaVariavel的头值路由器,匹配recursao头为true的消息 - 第二个是id为
processaRendaVariavel的头值路由器,匹配processa头为true的消息
- 第一个是id为
- 单播通道的
UnicastingDispatcher分发器默认会按顺序尝试将消息投递给订阅者,只要任意一个订阅者成功处理就完成投递。你日志里对应的消息头中不存在recursao字段,且recursaoRendaVariavel路由器配置了resolution-required="false"、未设置默认输出通道,所以该路由器处理时无法解析出目标转发通道,抛出了对应的异常。 - 分发器捕获到该异常后,自动执行故障转移逻辑,将消息投递给下一个订阅者
processaRendaVariavel,而消息头中存在processa=true刚好匹配该路由器规则,消息被正常转发处理,所以你整个流程的功能运行不受影响,只会打印该INFO级别的异常日志。
可选的解决方案(消除日志)
- 方案1:给
recursaoRendaVariavel路由器配置default-output-channel指向Spring内置的nullChannel,没有匹配规则的消息会直接被丢弃,不会抛出异常 - 方案2:将
xxx-consolidador-channel-segrega-renda-variavel改为发布订阅通道,两个路由器独立接收消息互不影响 - 方案3:调整
SplitterRecursaoRendaVariavel的逻辑,保证输出的消息要么带recursao=true头,要么不带processa头,避免两个路由器同时被触发的场景
内容的提问来源于stack exchange,提问作者Gabriel Gomes Crispim
相关产品推荐
相关产品推荐

