Spring integration Spring集成:如何使用当前有效负载更新索赔检查中的对象?

Spring integration Spring集成:如何使用当前有效负载更新索赔检查中的对象?,spring-integration,claims,Spring Integration,Claims,我正在使用Spring集成发送SOAP请求,接收SOAP响应,并对其进行处理。我还使用(或尝试使用)Claim Check模式将原始SOAP请求和响应存储在一个对象(称为ExchangeMessage的简单POJO)中,该对象如下所示: public class ExchangeMessage { protected String request; protected String response; ... 这就是我的流程当前的样子: (1) <int:transform

我正在使用Spring集成发送SOAP请求,接收SOAP响应,并对其进行处理。我还使用(或尝试使用)Claim Check模式将原始SOAP请求和响应存储在一个对象(称为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>
如果此服务激活器的有效负载是字符串(SOAP响应),那么我需要传递给how to ClaimCheckOutTransformer.transform()的消息来自哪里


我爱春天。但是这一个让我很困惑。

使用标头enricher在标头中保存您的
ExchangeMessage
会更简单,而不是使用声明检查

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


否则,您需要保存claimcheck有效负载(介于4和5之间)以及再次签出之前的响应-但这将是一个比简单地保存原始对象而根本不使用声明检查更复杂的流程。

使用标头enricher而不是使用声明检查在标头中保存您的
ExchangeMessage

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


否则,您需要在再次签出之前保存claimcheck有效负载(介于4和5之间)和响应-但这将是一个比简单地保存原始对象而根本不使用索赔检查更复杂的流程。

Hmmm。。。但标题不只是下一个下游消费者可以使用吗?换句话说,如果我在步骤(3)之后将ExchangeMessage放在一个报头中,然后调用出站网关(调用它(4),它是否仍然可以用于步骤(5),例如一个服务激活器,它在报头中获取ExchangeMessage并调用它的setResponse()方法?或者我必须在每个步骤中手动添加标头吗?我之前尝试过类似的操作…当标头Enricher添加标头时,尝试访问标头2或3个下游使用者,结果显示标头不存在…标头将保留在每个下游消息中。唯一的例外是如果您有一个custom transformer,它返回类型
Message
,而不仅仅是有效负载(可能是因为transformer也想操作头);在这种情况下,框架假设自定义转换器负责传播它想要保留的任何头;通常使用Message builder的
copyHeaders()
method.Wow,非常感谢,我不知道!这正是我在SI文档中寻找的信息——头文件的寿命有多长?我相信发生的事情是,我一定是在变压器后试图访问头文件,所以它不再存在。在玩完头文件后,我得出结论,使用Claim检查会更干净,因为我不必对每条消息进行序列化和反序列化。但我的用例——同时使用声明检查中存储的数据和当前有效负载——似乎太复杂了。再次感谢!嗯……但是头不是只对下一个下游消费者可用吗?换句话说,如果我在步骤(3)之后,在报头中创建ExchangeMessage,然后调用出站网关(调用它(4)),它是否仍然可以在步骤(5)中使用,例如一个服务激活器,它将获取报头中的ExchangeMessage并调用其setResponse()方法?或者我必须在每个步骤中手动添加标头吗?我之前尝试过类似的操作…当标头Enricher添加标头时,尝试访问标头2或3个下游使用者,结果显示标头不存在…标头将保留在每个下游消息中。唯一的例外是如果您有一个custom transformer,它返回类型
Message
,而不仅仅是有效负载(可能是因为transformer也想操作头);在这种情况下,框架假设自定义转换器负责传播它想要保留的任何头;通常使用Message builder的
copyHeaders()
method.Wow,非常感谢,我不知道!这正是我在SI文档中寻找的信息——头文件的寿命有多长?我相信发生的事情是,我一定是在变压器后试图访问头文件,所以它不再存在。在玩完头文件后,我得出结论,使用Claim检查会更干净,因为我不必对每条消息进行序列化和反序列化。但我的用例——同时使用声明检查中存储的数据和当前有效负载——似乎太复杂了。再次感谢!
SimpleMessageStore simpleMessageStore = (SimpleMessageStore)context.getBean("simpleMessageStore");
ClaimCheckOutTransformer claimCheckOutTransformer = new ClaimCheckOutTransformer(simpleMessageStore);
claimCheckOutTransformer.transform(Message???);