Spring Retry恢复方法未纳入Service Activator处理链问题咨询
Spring Integration重试恢复后消息脱离处理链问题解决
问题原因
你配置的retry-advice使用了recovery-channel属性,这个属性的作用是将重试耗尽的消息转发到独立通道处理,完全脱离原有Service Activator链。因此恢复方法的返回值不会回到原链的下一个节点redboxPreProcessor,同时恢复通道内的异常也不会触发原JMS适配器的redboxExceptionChannel——此时消息已经不在原消息流的上下文中了。
解决方案
方案一:使用recoverer替代recovery-channel(推荐)
将recovery-channel替换为recoverer,让恢复逻辑在原请求处理的上下文中执行,恢复方法的返回值会自动回到原处理链继续流转,异常也会正常传播到原适配器的错误通道。
修改后的retry-advice配置如下:
<int:service-activator ref="messagePersister" method="persistAndAddClientMessageIdToHeader"> <int:request-handler-advice-chain> <int:retry-advice max-attempts="4"> <int:exponential-back-off initial="800" multiplier="3" maximum="25000"/> <!-- 使用recoverer指定恢复方法,而非recovery-channel --> <int:recoverer ref="messagePersister" method="retriesExhausted"/> </int:retry-advice> </int:request-handler-advice-chain> </int:service-activator>
同时删除独立的persistenceRetriesExhaustedChannel对应的Service Activator配置,因为恢复逻辑已整合到重试通知中。
调整后效果:
- 重试耗尽后,
retriesExhausted方法的返回值会直接传递给链中的下一个节点redboxPreProcessor - 如果
retriesExhausted方法抛出异常,会触发原JMS适配器配置的redboxExceptionChannel
方案二:保留recovery-channel并手动衔接原链(不推荐)
若必须保留recovery-channel,需将恢复方法的输出定向到原链的后续处理节点。比如修改恢复Service Activator的配置,指定output-channel为原链的后续通道:
<int:service-activator ref="messagePersister" method="retriesExhausted" input-channel="persistenceRetriesExhaustedChannel" output-channel="redboxIncomingChannelProcessingChain$child.channel#1"/>
但这种方式依赖Spring Integration内部生成的通道名称,耦合性高、维护成本大,因此不推荐。
内容的提问来源于stack exchange,提问作者VPN236
相关产品推荐
相关产品推荐

