使用索赔检查模式保留有效负载中的一些信息?

时间:2014-04-22 17:05:32

标签: java spring spring-integration

我正在阅读Spring Integration中的Claim Check模式。

使用此模式时,听起来似乎整个有效负载都放在消息存储库中,并且生成的有效负载仅 声明检查ID。

Spring是否提供了一种简单的方法来将有效负载存储在消息存储库中,同时保留有效负载的特定部分?您是否需要首先使用标头扩充器并将要访问的属性存储在标头中?

例如,假设我的有效负载是一个简单的XML文档:

<payload>
    <cc>1234432156788765</cc>
    <or>5799</or>
</payload>

我想声明检查此有效内容但仍保留对payload.or元素的访问权限。如何使用当前的Spring Integration组件完成这项工作?

1 个答案:

答案 0 :(得分:4)

Claim Check的主要目的是存储消息,而不必担心消息的大小,因为消息可能会通过多个外部系统传播。它也可以在系统故障后恢复。

现实世界中最好的例子是飞行行李。在转机期间,您手边只有收据,并在最后收到行李。

为了实现您的目标,我建议您使用<enricher>

<int:enricher request-channel="claimCheckInChannel">
   <int:header name="claimCheck" expression="payload"/>
</int:enricher>

<claim-check-in input-channel="claimCheckInChannel" message-store="messageStore"/>

通过它,您不会丢失原始payload并在标题中进行声明检查id

注意:声明检查会将整个message与标题存储在一起,而不仅仅是payload。相关代码来自org.springframework.integration.transformer.ClaimCheckInTransformer

@Override
protected Object doTransform(Message<?> message) throws Exception {
    Assert.notNull(message, "message must not be null");
    Object payload = message.getPayload();
    Assert.notNull(payload, "payload must not be null");
    Message<?> storedMessage = this.messageStore.addMessage(message);
    MessageBuilder<?> responseBuilder = MessageBuilder.withPayload(storedMessage.getHeaders().getId());
    // headers on the 'current' message take precedence
    responseBuilder.copyHeaders(message.getHeaders());
    return responseBuilder.build();
}