当前位置: 首页 > 知识库问答 >
问题:

异步流中出站网关的错误处理

淳于开畅
2023-03-14

我有一个这样的集成流程:

@Bean
public IntegrationFlow inboundRequestFlow()
{
    return IntegrationFlows.from( inboundRequestGateway() )
        .log( ... )
        .filter(  requestValidator,
            spec -> spec.discardChannel( invalidRequestChannel() ) )
        .bridge( spec -> spec.requiresReply( false ) )
        .channel( asyncFlowChannel )
        .wireTap(
            //sends a NO_CONTENT reply if the request is ok
            flow -> flow.enrichHeaders( spec -> spec.header( HttpHeaders.STATUS_CODE, HttpStatus.NO_CONTENT ).defaultOverwrite( true ) )
                .transform( payload -> "" )
                .channel( inboundGatewayReplyChannel() )
        ).get();

}
@Bean
public IntegrationFlow outboundFlow()
{
    return IntegrationFlows.from( asyncFlowChannel)
        .log( ... )
        .transform( ... )
        .transform( ... )
        .split(... )            
        .resequence( ... )
        .enrichHeaders( ... )
        .log( ... )
        .transform( ... )
        .handle( this.outboundSOAPGateway() )
        .log( .. )
        .handle( ... )
        .bridge( spec -> spec.requiresReply( false ) )
        .channel( anotherAsyncFlowChannel )
        .get();
}

共有1个答案

温凯
2023-03-14

任何MessageHandlerendpoint都可以使用AbstractrequestHandlerAdvise提供。其中之一是ExpressionEvaluatingRequestHandlerAdvise,在这里可以捕获异常并将其发送到FailureChannel:https://docs.spring.io/spring-integration/docs/5.0.0.release/reference/html/messaging-endpoints-chapter.html#expression-advision。

为此,.handle(this.outboundsoapgateway())可以提供第二个参数,例如:

.handle((GenericHandler<?>) (p, h) -> {
                    throw new RuntimeException("intentional");
                }, e -> e.advice(retryAdvice()))

在本例中,我使用

@Bean
public RequestHandlerRetryAdvice retryAdvice() {
    RequestHandlerRetryAdvice requestHandlerRetryAdvice = new RequestHandlerRetryAdvice();
    requestHandlerRetryAdvice.setRecoveryCallback(new ErrorMessageSendingRecoverer(recoveryChannel()));
    return requestHandlerRetryAdvice;
}

但对于ExpressionEvaluatingRequestHandlerAdvision也是如此。

顺便说一句,retryAdvise()也可以为您提供这个技巧。请参见其ErrorMessageSendingRecoverer

 类似资料:
  • 我试图理解在Spring集成中应该如何处理错误。我找到了关于的文档,我试图使用它,但没有捕获异常。 下面是我的HTTP出站网关: 我不明白应该在哪里捕捉这个组件引发的异常(比如500 HTTP错误) 路由由启动。我尝试添加属性: 我尝试使用自定义错误通道。我还尝试重写现有的ErrorChannel:

  • 问题内容: 我具有以下Spring Integration配置,该配置允许我从MVC Controller调用网关方法并让控制器返回,而集成流将在不阻塞控制器的单独线程中继续进行。 但是,我无法弄清楚如何使我的错误处理程序为该异步流工作。我的网关定义了错误通道,但是由于某种原因我的异常没有到达。相反,我看到被调用了。 网关: 为了查看我的错误处理程序正在处理的异步集成流程中发生的异常,我该怎么办?

  • 我有下一个配置: 入境 出站: 链条1: 链2: 错误: Java Transformer: 当出站的Web服务关闭时,错误进入错误通道转换器,但要响应,我们有下一个错误: o、 s.m.c.GenericMessageTemplate$TemporaryReplyChannel#242已收到回复消息,但由于发送请求消息时出现异常,接收线程已退出:GenericMessage[payload=[#

  • 我们的Web应用一旦上线之后,那么各种错误出现的概率都有,Web应用日常运行中可能出现多种错误,具体如下所示: 数据库错误:指与访问数据库服务器或数据相关的错误。例如,以下可能出现的一些数据库错误。 连接错误:这一类错误可能是数据库服务器网络断开、用户名密码不正确、或者数据库不存在。 查询错误:使用的SQL非法导致错误,这样子SQL错误如果程序经过严格的测试应该可以避免。 数据错误:数据库中的约束

  • 编写JavaScript代码时,我们要时刻牢记,JavaScript引擎是一个事件驱动的执行引擎,代码总是以单线程执行,而回调函数的执行需要等到下一个满足条件的事件出现后,才会被执行。 例如,setTimeout()函数可以传入回调函数,并在指定若干毫秒后执行: function printTime() { console.log('It is time!'); } setTimeout

  • 问题内容: 我对Node.js并不陌生,尽管我通常对JavaScript非常熟悉。我的问题是关于如何处理node.js中的错误的“最佳实践”。 通常,在对Web服务器,FastCGI服务器或各种语言的网页进行编程时,我在多线程环境中使用带有阻止处理程序的Exceptions。当有请求进入时,我通常会执行以下操作: 这样,我始终可以处理内部错误并向用户发送有效响应。 我知道使用node.js可以执行