Spring Integration报DestinationResolutionException无对应通道头问题咨询
异常产生原因
这个错误的核心诱因来自两个错误配置:
- 误用
wireTap组件承载核心业务逻辑:wireTap是Spring Integration提供的旁路监听组件,仅做消息副本的异步处理,本身不会将原消息向下游传递,也不会将处理结果回传到主流程。你在两个recipient子流中用wireTap调用insertUpdateMergeAdapter、deleteAdapter,又在主流程末尾用wireTap调用cleanupAdapter,导致核心业务处理完成后没有消息继续向下游流转,后续的aggregate聚合器根本收不到待聚合的消息。 - 单向Outbound Adapter无返回输出:你用到的insert/delete/cleanup适配器都属于单向出站适配器,本身处理完业务后不会产生reply消息。主流程经过路由、拆分后,消息在子流处理完毕就直接终止,没有消息返回父流触发后续聚合、清理逻辑,消息链路中断后框架找不到下游输出通道,就会抛出
no output-channel or replyChannel header available异常。
解决方案
首先明确两个配置原则:核心业务逻辑不要用wireTap承载,单向适配器处理完后需要主动将消息向下游传递;子流处理完成后必须有输出回到父流,才能触发后续的聚合、清理步骤。
修改后的正确流程配置如下:
return flowDef .channel(receiveChannel) .handle(inboundAdapter) .split(insertDeleteSplitter) .enrichHeaders(h -> h.headerExpression("ALC_operation", "payload[0].get(\"operation\")")) .routeToRecipients(r -> r .recipientFlow("'I' == headers.ALC_operation or 'U' == headers.ALC_operation", f -> f .split(insertSplitter) .channel(insertUpdateChannel) // 直接用handle处理核心插入更新逻辑,不用wireTap .handle(insertUpdateMergeAdapter) // 单向适配器处理完后,桥接原消息向下游传递 .bridge() ) .recipientFlow("'D' == headers.ALC_operation", f -> f .split(deleteSplitter) .channel(deleteChannel) // 直接用handle处理删除逻辑 .handle(deleteAdapter) // 桥接消息向下游传递 .bridge() ) .defaultOutputToParentFlow() ) // 配置聚合器的关联、释放策略,确保所有拆分消息处理完成才触发聚合 .aggregate(a -> a.correlationExpression("headers.ALC_operation") .releaseStrategy(group -> group.size() == group.getSequenceSize())) .channel(cleanupChannel) // 直接handle清理逻辑,不用wireTap .handle(cleanupAdapter);
如果需要适配你后续调整的发布订阅模式的流程,只需要给删除操作也新增对应的subscribe分支,两个分支都处理完成后再聚合执行清理即可。
内容的提问来源于stack exchange,提问作者Shreyas
相关产品推荐
相关产品推荐

