如何正确实现Spring Integration异步WireTap无回复流程?
问题解决方案
1. 解决无订阅者异常
你遇到的无订阅者异常并非来自设置了requiresReply=false的handle,而是因为子流程执行到aggregate后没有后续消息消费者,导致处理完成的消息无处投递引发异常。无需依赖忽略异常的Advice,直接在aggregate之后接入nullChannel即可静默消费最终结果,彻底解决该问题。
2. 移除冗余Handler添加Poller
完全不需要那个冗余的handle((p, h) -> p),可以直接在定义子流程起点时配置Poller。因为QueueChannel是轮询型通道,IntegrationFlow.from()方法支持直接传入Poller配置,代码修改如下:
@Bean public IntegrationFlow versionFlow() { return IntegrationFlow.from(versionQueueChannel(), e -> e.poller(Pollers.fixedDelay(1000).maxMessagesPerPoll(1))) .split(new VersionIssueSplitter()) .handle(longProcess) .aggregate() .channel("nullChannel") // 处理聚合后的结果,避免无订阅者异常 .get(); }
补充说明:主流程中的wireTap本身就是异步发送消息到versionQueueChannel的,所以主流程jiraVersionWebhook会快速返回响应,不会被子流程的长耗时操作阻塞,这部分逻辑是正常的。
内容的提问来源于stack exchange,提问作者Médéric Martin
相关产品推荐
相关产品推荐

