我使用Spring Integration发送SOAP请求,接收SOAP响应并处理它。我还使用(或尝试使用)Claim Check模式将原始SOAP请求和响应存储在Object中,这是一个名为ExchangeMessage的简单POJO,如下所示:
public class ExchangeMessage {
protected String request;
protected String response;
...
这就是我目前的流程:
(1) <int:transformer input-channel="transformerChannel" output-channel="requestChannel"/>
(2) <int:gateway default-request-channel="transformerChannel" />
<int:chain input-channel="requestChannel" output-channel="loggerChannel">
(3) <int:service-activator ref="exchangeMessageServiceActivator" />
(4) <int:claim-check-in/>
(5) <int:claim-check-out/>
(6) <int:transformer expression="payload.getRequest()" />
(7) <ws:outbound-gateway uri="http://.../>
(8) <int:transformer ref="xmlMsgToPojoTransformer" />
... processing ...
</int:chain>
基本上,在(1)和(2)中,我向入站网关发送一个简单的POJO,并将其转换为简单的SOAP请求(字符串)。
在链中,在(3)中,exchangeMessageServiceActivator bean接受String,并创建一个ExchangeMessage对象,使用SOAP请求调用其setRequest()方法。
在(4)中,我将新创建的ExchangeMessage保存在Claim Check中。
在(5)中,我将其检出并在(6)和(7)中将ExchangeMessage.getRequest()的内容发送到WS Outbound Gateway。我知道我可以使用Header Enricher完成此操作,但是因为我想要保存ExchangeMessage对象,我认为它几乎是一样的,即使在声明签入后立即调用声明检出是一种难看。
问题在(7)和(8)之间开始。 (7)的有效负载是SOAP响应。 在将其解组为Object(然后处理它...)之前,我想使用&lt;&lt;&lt;声明检出&gt;,使用SOAP响应调用ExchangeMessage.setResponse()方法,然后将SOAP响应转换为对象进行处理。
问题是,如果在(7)和(8)之间我坚持&lt;声明检出&gt;,我丢失了(7)SOAP响应的原始有效载荷。
我考虑在(7)和(8)之间使用某种Service Activator,以某种方式从Claim Check加载ExchangeMessage,并使用(7)中的有效负载调用其setResponse()方法,但是我无法弄清楚该怎么做。我已经走到了这一步:
SimpleMessageStore simpleMessageStore = (SimpleMessageStore)context.getBean("simpleMessageStore");
ClaimCheckOutTransformer claimCheckOutTransformer = new ClaimCheckOutTransformer(simpleMessageStore);
claimCheckOutTransformer.transform(Message???);
如果此Service Activator的有效负载是String(SOAP响应),Message的来源是什么,我需要传递给ClaimCheckOutTransformer.transform()?
我喜欢Spring Integration。但这个让我难过。
答案 0 :(得分:0)
使用标题扩充程序将标题ExchangeMessage
保存在标题中会更简单,而不是使用声明检查。
这样,您可以在以后的流程中调用setResponse()
。
否则,您需要在再次签出之前保存claimcheck有效负载(4到5之间)以及响应 - 但这比仅仅保存原始对象而不使用声明更复杂检查一下。