我们正在使用Spring IntegrationSplit和Aggregate来并行处理大型请求的子消息流。
对于错误流,希望流在所有子消息都被处理时处理异常,以便我们可以在聚合阶段处理异常。
为了存档以上,我们考虑使用示例建议:
@Bean
ExpressionEvaluatingRequestHandlerAdvice example() {
final var advice = new ExpressionEvaluatingRequestHandlerAdvice();
advice.setTrapException(true);
advice.setOnFailureExpressionString("payload + ' exception:' + #exception");
advice.setReturnFailureExpressionResult(true);
return advice;
}
上面的示例将ErrorMessage作为String连同有效负载和异常一起返回。
但我们需要的是将有效负载和异常作为分离的对象,以便可以在错误通道中处理它,然后我们可以从异常详细信息中提取信息,并将有效负载用于其他逻辑。
当google发现payload可以返回如下,但随后异常未被捕获。
advice.setOnFailureExpression(
new FunctionExpression<Message<?>>(s ->
MessageBuilder
.withPayload(s.getPayload())
.copyHeaders(s.getHeaders()).build())
);
Spring集成会给出一些如何在上面存档的示例吗?谢谢!
FunctionExtion
基于纯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
中,并将其放入有效负载中以进行进一步的错误处理。但是,在这种情况下,我不确定您的聚合器将如何应对异常负载。