Spring Integration 如何返回带有异常的有效负载和建议?

问题描述 投票:0回答:1

我们正在使用 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 能否举例说明上面如何归档?谢谢!

spring-integration
1个回答
0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.