我正在阅读Spring Integration中的Claim Check模式。
使用此模式时,听起来似乎整个有效负载都放在消息存储库中,并且生成的有效负载仅 声明检查ID。
Spring是否提供了一种简单的方法来将有效负载存储在消息存储库中,同时保留有效负载的特定部分?您是否需要首先使用标头扩充器并将要访问的属性存储在标头中?
例如,假设我的有效负载是一个简单的XML文档:
<payload>
<cc>1234432156788765</cc>
<or>5799</or>
</payload>
我想声明检查此有效内容但仍保留对payload.or
元素的访问权限。如何使用当前的Spring Integration组件完成这项工作?
答案 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();
}