我正在寻找一种带有拆分/聚合的集成流程。我希望捕获处理程序抛出的异常,并逐个迭代拆分的所有元素,即使某些元素失败。当所有元素都抛出异常,并且捕获异常时,流程永远不会结束。请问我遗漏了什么?我如何才能达到聚合并结束此流程?
IntegrationFlow.from(
WebFlux.inboundGateway("/jira/version")
.requestMapping(r -> r.methods(HttpMethod.POST)
.consumes("application/json"))
.requestPayloadType(String.class)
.replyChannel(replyChannel)
.errorChannel(errorChannel)
.mappedRequestHeaders(parameter.getJiraHeaderSignature()))
.handle(versionWebhookHandler)
.split(new VersionIssueSplitter())
.handle(updateVersionHandler, s -> s.advice(advice()))
.aggregate()
.get();
public Advice advice() {
var advice = new ExpressionEvaluatingRequestHandlerAdvice();
advice.setTrapException(true);
return advice;
}
这
advice.setTrapException(true);
是不让异常冒泡并允许分离器自然迭代的正确方法。您的问题在于
.aggregate()
。虽然默认情况下拆分器和聚合器协同工作非常方便,但您必须确保所有元素都到达该聚合器,才能正确完成消息组。handle
当您在项目处理中捕获(或简单地说是捕获)异常时,从那里向下发送没有回复aggregate
。因此,聚合器无法满足组完成要求,因此您的流程永远不会结束。我们不知道您的期望是什么,但显然您必须以任何方式发出任何内容,即使项目处理最终出现错误。您可能会想出一些自定义对象来从 and
failureExpression
而returnFailureExpressionResult = true
不是 中返回trapException
。然后,处理程序将负责将此结果包装到带有来自请求的适当关联详细信息标头的消息中。然后你可以看看:
对分组消息进行迭代,如果下游不需要这些消息,则过滤掉有错误的消息。
有关关联详细信息,请参阅文档:https ://docs.spring.io/spring-integration/reference/aggregator.html