Spring集成:如何使用当前有效负载更新Claim Check中的Object?

时间:2016-12-12 13:26:46

标签: spring-integration claims

我使用Spring Integration发送SOAP请求,接收SOAP响应并处理它。我还使用(或尝试使用)Claim Check模式将原始SOAP请求和响应存储在Object中,这是一个名为ExchangeMes​​sage的简单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)中,exchangeMes​​sageServiceActivator bean接受String,并创建一个ExchangeMes​​sage对象,使用SOAP请求调用其setRequest()方法。

在(4)中,我将新创建的ExchangeMes​​sage保存在Claim Check中。

在(5)中,我将其检出并在(6)和(7)中将ExchangeMes​​sage.getRequest()的内容发送到WS Outbound Gateway。我知道我可以使用Header Enricher完成此操作,但是因为我想要保存ExchangeMes​​sage对象,我认为它几乎是一样的,即使在声明签入后立即调用声明检出是一种难看。

问题在(7)和(8)之间开始。 (7)的有效负载是SOAP响应。 将其解组为Object(然后处理它...)之前,我想使用&lt;&lt;&lt;声明检出&gt;,使用SOAP响应调用ExchangeMes​​sage.setResponse()方法,然后将SOAP响应转换为对象进行处理。

问题是,如果在(7)和(8)之间我坚持&lt;声明检出&gt;,我丢失了(7)SOAP响应的原始有效载荷。

我考虑在(7)和(8)之间使用某种Service Activator,以某种方式从Claim Check加载ExchangeMes​​sage,并使用(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。但这个让我难过。

1 个答案:

答案 0 :(得分:0)

使用标题扩充程序将标题ExchangeMessage保存在标题中会更简单,而不是使用声明检查。

这样,您可以在以后的流程中调用setResponse()

否则,您需要在再次签出之前保存claimcheck有效负载(4到5之间)以及响应 - 但这比仅仅保存原始对象而不使用声明更复杂检查一下。