Spring 集成:如何使用当前负载更新 Claim Check 中的对象?

Spring Integration: How to update Object in Claim Check with current payload?

我正在使用 Spring 集成来发送 SOAP 请求、接收 SOAP 响应并处理它。我也在使用(或试图使用)Claim Check 模式将原始 SOAP 请求和响应存储在一个对象中,一个简单的 POJO,称为 ExchangeMes​​sage,如下所示:

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 接受字符串,并创建一个 ExchangeMes​​sage 对象,使用 SOAP 请求调用其 setRequest() 方法。

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

在 (5) 中,我将其重新签出,然后在 (6) 和 (7) 中将 ExchangeMessage.getRequest() 的内容发送到 WS 出站网关。我意识到我可以使用 Header Enricher 完成此操作,但由于无论如何我都想保存 ExchangeMes​​sage 对象,我认为这几乎是同一件事,即使在声明签入后立即调用声明签出有点像丑。

问题从(7)和(8)之间开始。 (7) 的负载是 SOAP 响应。 将其解组为一个对象(然后对其进行处理...)之前,我想使用 检索 ExchangeMes​​sage,调用 ExchangeMessage.setResponse()方法与 SOAP 响应,然后然后将 SOAP 响应转换为对象以进行处理。

问题是,如果我在 (7) 和 (8) 之间粘贴 ,我将丢失 (7) 的原始负载,即 SOAP 响应。

我考虑过在 (7) 和 (8) 之间使用某种服务激活器,以某种方式从 Claim Check 加载 ExchangeMes​​sage,并使用来自 (7) 的有效负载调用其 setResponse() 方法,但我不知道该怎么做。我已经走到这一步了:

SimpleMessageStore simpleMessageStore = (SimpleMessageStore)context.getBean("simpleMessageStore");
ClaimCheckOutTransformer claimCheckOutTransformer = new ClaimCheckOutTransformer(simpleMessageStore);
claimCheckOutTransformer.transform(Message???);

如果此服务激活器的有效负载将是一个字符串(SOAP 响应),消息来自哪里,我需要传递给如何 ClaimCheckOutTransformer.transform()?

我喜欢 Spring 集成。但是这个让我难住了。

使用 header-enricher 在 header 中保存您的 ExchangeMessage 比使用索赔支票更简单。

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

否则,您需要保存 claimmeck 负载(在 4 到 5 之间)以及再次签出之前的响应 - 但这将是一个比简单保存原始内容更复杂的流程 object 并且根本不使用索赔检查。