提问者:小点点

Spring集成如何与异常一起返回有效负载并提供建议?


我们正在使用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集成会给出一些如何在上面存档的示例吗?谢谢!


共1个答案

匿名用户

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中,并将其放入有效负载中以进行进一步的错误处理。但是,在这种情况下,我不确定您的聚合器将如何应对异常负载。