Web services SoapFault后继续执行Spring集成流

Web services SoapFault后继续执行Spring集成流,web-services,spring-integration,soapfault,Web Services,Spring Integration,Soapfault,我们的应用程序集成流程定义为拆分器->ws网关->聚合器 拆分器将请求拆分为帐号列表;因此,对于每个帐号,将启动一个web服务调用,并在聚合器中聚合来自多个web服务调用的响应。拆分器和ws-gateway之间的通道由dispatcher“commonj WorkManagerTaskExecutor”定义,以便在不同线程中并行启动每个web服务调用 如果至少部分web服务调用响应正确;即使所有其他调用都导致SoapFault;我们需要通过使用来自成功响应的数据以及引用来自故障响应的错误消息的警

我们的应用程序集成流程定义为拆分器->ws网关->聚合器 拆分器将请求拆分为帐号列表;因此,对于每个帐号,将启动一个web服务调用,并在聚合器中聚合来自多个web服务调用的响应。拆分器和ws-gateway之间的通道由dispatcher“commonj WorkManagerTaskExecutor”定义,以便在不同线程中并行启动每个web服务调用

如果至少部分web服务调用响应正确;即使所有其他调用都导致SoapFault;我们需要通过使用来自成功响应的数据以及引用来自故障响应的错误消息的警告消息来处理该场景

问题是ws-gateway中定义的FaultMessageResolver的resolveFault()方法不返回任何内容,并且如果至少一个并行web服务调用失败,则控件永远不会到达聚合器。有没有办法处理这种情况

  • 您可以将
    SoapFaultMessageResolver
    注入
    故障消息解析器
    )。这个代码非常简单:

    public void resolveFault(WebServiceMessage message) throws IOException {
        SoapMessage soapMessage = (SoapMessage) message;
        throw new SoapFaultClientException(soapMessage);
    }
    
  • 因此,失败的WS-invocation将以
    异常结束

  • 添加到您的
    中,并在其中放置一个
    表达式评估RequestHandlerAdvice的实例。指定它的
    errorChannel
    ,并在该子流中执行一些不可知逻辑,然后向聚合器发送一些特定消息。不要忘记携带带有该消息的
    sequenceDetails
    标题

  • 将所有消息放入组聚合器将能够释放,这与正常情况一样

  • 最后,您可以分析结果
    列表
    中的错误和正常响应


  • 谢谢@Artem Bilan。你的回答为我们提供了解决办法。我们可以使用请求处理程序建议链将错误消息重定向到聚合器中