Spring Integration inbound-gateway如何将soap请求保存到文件中?

时间:2017-01-18 04:41:33

标签: web-services spring-integration inbound

在Spring Integration中,使用入站网关,您知道如何将每个SOAP WS请求保存到单独的文件中吗?

目前,我坚持:

<!-- inbound -->
<ws:inbound-gateway id="inbound-gateway" request-channel="SOAPRequestChannel" reply-channel="SOAPResponseChannel"/>
<int:channel id="SOAPRequestChannel">
    <int:interceptors>
        <int:wire-tap channel="SOAPRequestChannelForLog"/>
    </int:interceptors>
</int:channel>
<int:channel id="SOAPResponseChannel" />
<int:channel id="SOAPRequestChannelForLog" />   

<int:logging-channel-adapter id="logger" expression="payload" level="INFO" channel="SOAPRequestChannelForLog"/>

但它只是将所有请求记录在1个文件中。

或者我必须编写另一个类,如LogToFile,它有一个方法将该请求保存到文件中,用int:service-activator替换int:logging-channel-adapter? Spring是否支持开箱即用的每个SOAP请求记录?我阅读了参考文档,但找不到任何东西。

还是有更好的方法吗? ^ _ ^

此致

2 个答案:

答案 0 :(得分:1)

我发现Spring支持PayloadLoggingInterceptor&amp; SoapEnvelopeLoggingInterceptor首先阅读Spring Web Service 2 Cookbook一书,然后检查参考文档。它在那里^

我将结合如何将log4j2日志记录到这里描述的分隔文件中 Log4j2: How to write logs to separate files for each user?

答案 1 :(得分:1)

首先PayloadLoggingInterceptor基于org.apache.commons.logging.Log,这已经是您的应用程序职责,它将目标日志系统用于目标。是的,Log4j2就是其中之一。只需要从Commons Logging到目标impl有一个合适的桥梁。看起来它对于Log4j来说是开箱即用的......

如果要将每个请求存储到自己的文件中,请考虑使用<int-file:outbound-channel-adapter>来实现此目的。

您只需根据收到的消息构建适当的内容:

Transformer transformer = createNonIndentingTransformer();
StringWriter writer = new StringWriter();
transformer.transform(source, new StreamResult(writer));
String message = writer.toString();

source之后的payload<ws:inbound-gateway>之后消息的file name

您只需要根据该消息或其他环境找出if (some condition) { view = inflater.inflate(R.layout.mylayout, container, false); } else { view = inflater.inflate(R.layout.mylayout_no_cell, container, false); }