在 SoapFault 之后继续 Spring 集成流程
Continuing with Spring integration flow after SoapFault
我们的应用程序集成流程定义为拆分器 -> ws 网关 -> 聚合器
拆分器将请求拆分为帐号列表;因此,对于每个帐号,都会启动一个 Web 服务调用,并且来自多个 Web 服务调用的响应会聚集在拆分器和 ws 网关之间的 aggregator.The 通道中,并使用调度程序 "commonj WorkManagerTaskExecutor" 进行定义,以便每个 Web 服务调用都是在不同线程中并行启动。
如果至少部分网络服务调用正确响应;即使所有其他调用都导致 SoapFault;我们需要通过使用来自成功响应的数据和一条引用来自故障响应的错误消息的警告消息来处理这种情况。
问题是 ws 网关中定义的 FaultMessageResolver 的 resolveFault() 方法没有 return 任何东西,如果至少一个并行 Web 服务调用失败,控件永远不会到达聚合器。有什么办法可以处理这种情况吗
您可以将 SoapFaultMessageResolver
注入 <int-ws:outbound-gateway>
(fault-message-resolver
)。这个代码非常简单:
public void resolveFault(WebServiceMessage message) throws IOException {
SoapMessage soapMessage = (SoapMessage) message;
throw new SoapFaultClientException(soapMessage);
}
因此,您失败的 WS 调用将以 Exception
结束。
将 <int-ws:request-handler-advice-chain>
添加到您的 <int-ws:outbound-gateway>
并在那里放置一个 ExpressionEvaluatingRequestHandlerAdvice
的实例。指定它的 errorChannel
并在其中做一些不可知的逻辑 sub-flow 并向您的聚合器发送一些特定的消息。不要忘记在消息中携带 sequenceDetails
headers。
群聚合器中的所有消息都可以正常发布。
最后你可以分析结果List
错误和正常响应。
我们的应用程序集成流程定义为拆分器 -> ws 网关 -> 聚合器 拆分器将请求拆分为帐号列表;因此,对于每个帐号,都会启动一个 Web 服务调用,并且来自多个 Web 服务调用的响应会聚集在拆分器和 ws 网关之间的 aggregator.The 通道中,并使用调度程序 "commonj WorkManagerTaskExecutor" 进行定义,以便每个 Web 服务调用都是在不同线程中并行启动。
如果至少部分网络服务调用正确响应;即使所有其他调用都导致 SoapFault;我们需要通过使用来自成功响应的数据和一条引用来自故障响应的错误消息的警告消息来处理这种情况。
问题是 ws 网关中定义的 FaultMessageResolver 的 resolveFault() 方法没有 return 任何东西,如果至少一个并行 Web 服务调用失败,控件永远不会到达聚合器。有什么办法可以处理这种情况吗
您可以将
SoapFaultMessageResolver
注入<int-ws:outbound-gateway>
(fault-message-resolver
)。这个代码非常简单:public void resolveFault(WebServiceMessage message) throws IOException { SoapMessage soapMessage = (SoapMessage) message; throw new SoapFaultClientException(soapMessage); }
因此,您失败的 WS 调用将以 Exception
结束。
将
<int-ws:request-handler-advice-chain>
添加到您的<int-ws:outbound-gateway>
并在那里放置一个ExpressionEvaluatingRequestHandlerAdvice
的实例。指定它的errorChannel
并在其中做一些不可知的逻辑 sub-flow 并向您的聚合器发送一些特定的消息。不要忘记在消息中携带sequenceDetails
headers。群聚合器中的所有消息都可以正常发布。
最后你可以分析结果
List
错误和正常响应。