Spring integration Spring集成WS响应消息日志记录

Spring integration Spring集成WS响应消息日志记录,spring-integration,Spring Integration,请让我知道是否有任何方法可以截获发送到ws-inbound gateway的soap响应,将元信息添加到soap头并将整个soap信封传递给SI文件出站适配器,它将把响应记录在一个文件中。您应该实现EndpointInterceptor并将其注入AbstractEndpointMapping 在其handleResponse()中,您可以访问 SoapMessage soapMessage = ((SoapMessage) messageContext.getResponse()); 执行任何

请让我知道是否有任何方法可以截获发送到ws-inbound gateway的soap响应,将元信息添加到soap头并将整个soap信封传递给SI文件出站适配器,它将把响应记录在一个文件中。

您应该实现
EndpointInterceptor
并将其注入
AbstractEndpointMapping

在其
handleResponse()
中,您可以访问

SoapMessage soapMessage = ((SoapMessage) messageContext.getResponse());
执行任何您想要的操作,并向该
的注入通道发送Spring集成消息

更新

1) 发送回ws-inbound gateway的响应也被修改,我不希望这样。我只希望修改发送到文件适配器的soap响应。因为有一些元信息需要记录2)如何使文件出站适配器记录异步。。就像窃听一样

首先,很抱歉耽搁了

不,你不能用同一个物体。这是多线程环境中可变对象的典型问题。如果一个线程修改对象,另一个线程可以看到这些更改。在这种情况下,
wireltap
没有帮助

我建议您以某种方式克隆您的SOAP消息对象,或者更好地将其转换为字符串,构建一条新消息,然后将其发送到文件适配器:

TransformerHelper transformerHelper = new TransformerHelper();
Result result = new StringResult();
SoapMessage soapMessage = ((SoapMessage) messageContext.getResponse());
Source source = soapMessage.getEnvelope().getSource();
transformerHelper.transform(source, result);
String responseXml = result.toString();

您应该实现
EndpointInterceptor
,并将其注入
AbstractEndpointMapping

在其
handleResponse()
中,您可以访问

SoapMessage soapMessage = ((SoapMessage) messageContext.getResponse());
执行任何您想要的操作,并向该
的注入通道发送Spring集成消息

更新

1) 发送回ws-inbound gateway的响应也被修改,我不希望这样。我只希望修改发送到文件适配器的soap响应。因为有一些元信息需要记录2)如何使文件出站适配器记录异步。。就像窃听一样

首先,很抱歉耽搁了

不,你不能用同一个物体。这是多线程环境中可变对象的典型问题。如果一个线程修改对象,另一个线程可以看到这些更改。在这种情况下,
wireltap
没有帮助

我建议您以某种方式克隆您的SOAP消息对象,或者更好地将其转换为字符串,构建一条新消息,然后将其发送到文件适配器:

TransformerHelper transformerHelper = new TransformerHelper();
Result result = new StringResult();
SoapMessage soapMessage = ((SoapMessage) messageContext.getResponse());
Source source = soapMessage.getEnvelope().getSource();
transformerHelper.transform(source, result);
String responseXml = result.toString();

嗨,Artem,在整个消息处理过程中,我有一个messageContext对象可用(使用端点拦截器.handleRequest(),我将其保存在线程本地)。所以我的想法是在响应通道拦截器中,我将调用messageContext.getResponse()来获取响应soap信封。但它是空的。因此,我不确定在实际的消息处理周期中,消息上下文在何处用响应消息更新。(我使用这个概念使用messageContext.getRequest()记录请求消息)我认为
ThreadLocal
变量根本没有更新,因为它与实际响应过程无关。您确实应该在拦截器的
handleResponse()
中执行响应操作。好的,我记得你关于这件事的所有其他问题,对我来说真的很奇怪,你没有带着更新回来…:)嗨,阿泰姆。我让它工作了。但有两个问题。1) 发送回ws-inbound gateway的响应也被修改,我不希望这样。我只希望修改发送到文件适配器的soap响应。因为有一些元信息需要记录2)如何使文件出站适配器记录异步。。就像窃听一样。请查看我的
更新。是的,这是唯一的解决方案。我试过了,现在正在工作。在整个消息处理过程中,我有一个messageContext对象(使用end point interceptor.HandlerRequest(),我将它保存在本地线程中)。所以我的想法是在响应通道拦截器中,我将调用messageContext.getResponse()来获取响应soap信封。但它是空的。因此,我不确定在实际的消息处理周期中,消息上下文在何处用响应消息更新。(我使用这个概念使用messageContext.getRequest()记录请求消息)我认为
ThreadLocal
变量根本没有更新,因为它与实际响应过程无关。您确实应该在拦截器的
handleResponse()
中执行响应操作。好的,我记得你关于这件事的所有其他问题,对我来说真的很奇怪,你没有带着更新回来…:)嗨,阿泰姆。我让它工作了。但有两个问题。1) 发送回ws-inbound gateway的响应也被修改,我不希望这样。我只希望修改发送到文件适配器的soap响应。因为有一些元信息需要记录2)如何使文件出站适配器记录异步。。就像窃听一样。请查看我的
更新。是的,这是唯一的解决方案。我试过了,正在工作