我们正在使用 Spring Integration Split 和 Aggregate 来并行处理大型请求的子消息流。
对于错误流程,希望流程在所有子消息都处理完时处理异常,以便我们可以在聚合阶段处理异常。
为了存档以上,我们考虑使用示例建议:
@Bean
ExpressionEvaluatingRequestHandlerAdvice example() {
final var advice = new ExpressionEvaluatingRequestHandlerAdvice();
advice.setTrapException(true);
advice.setOnFailureExpressionString("payload + ' exception:' + #exception");
advice.setReturnFailureExpressionResult(true);
return advice;
}
以上示例将返回 ErrorMessage 作为字符串以及有效负载和异常。
但是我们需要的是有效负载和异常作为分离的对象,以便它可以在错误通道中处理,然后我们可以从异常详细信息中提取信息,并将有效负载用于其他逻辑。
当谷歌发现有效负载可以返回如下,但没有捕获异常。
advice.setOnFailureExpression(
new FunctionExpression<Message<?>>(s ->
MessageBuilder
.withPayload(s.getPayload())
.copyHeaders(s.getHeaders()).build())
);
Spring Integration 能否举例说明上面如何归档?谢谢!
FunctionExpression
基于普通的Function
,所以它只能有一个输入参数。因此,预计您无法访问异常,因为使用标准 SpEL 表达式是可能的。
您可以通过 SpEL 表达式实现类似于该函数逻辑的东西。但是我建议从 SpEL 中获取一些 Spring 钩子,特别是一些 bean 的调用。
所以,让它像这样工作是可能的:
advice.setOnFailureExpressionString("@myFailureHandler.handleError(#root, #exception)");
然后你需要有一个带有
myFailureHandler
名称的 bean 并且有一个可能的实现是这样的:
public Message<?> handleError(Message<?> failedMessage, Exception exception) {
return MessageBuilder.fromMessage(failedMessage)
.copyHeaders("error", exception)
.build()
}
或者您可以将该异常包装到
MessageHandlingException
中并将其放入有效负载中以进行进一步的错误处理。但是在这种情况下,我不确定您的聚合器将如何对异常负载做出反应。