是否可以在spring集成中覆盖消息头id的值?

时间:2014-12-11 11:33:57

标签: spring spring-integration

我正在使用中的声明检查模式,但我希望将消息与自定义ID一起存储。这应该很简单,因为消息存储实现使用传入消息头id来存储消息。是否可以使用标题扩充器或/和标头过滤器覆盖邮件标头ID的值?

邮件标头ID和邮件存储

SimpleMessageStore以及JdbcMessageStore正在使用传入的邮件ID来存储邮件。在addMessage方法(示例来自SimpleMessageStore)中,我们有:

this.idToMessage.put(message.getHeaders().getId(), message); 

要获得自定义ID,应该足以在声明签入之前使标头更加丰富,其中id标头的值将替换为自定义值。例如:

<int:header-enricher input-channel="gateDocCheckInReqChannel" 
    output-channel="gateDocCheckInEnrichedChannel">
    <int:header name="id" expression="payload.getDocumentID()" overwrite="true" />
</int:header-enricher>
<int:claim-check-in input-channel="gateDocCheckInEnrichedChannel" 
    output-channel="gateDocCheckInReplyChannel" message-store="messageStore" />

它不起作用;邮件头ID不会被覆盖。我尝试在标题增加之前在ID上使用标题过滤器,但它也不起作用。

相关

我找到了关于删除一些内部逻辑撤消的标题字段的旧帖子:
http://forum.spring.io/forum/spring-projects/integration/74099-remove-header-fields
此外,在消息处理程序上有一个关闭的问题INT-923,它可以撤消标题删除。
https://jira.spring.io/browse/INT-923
假设头文件过滤器上的问题INT-1135修复了这种行为。
https://jira.spring.io/browse/INT-1135

2 个答案:

答案 0 :(得分:2)

实际上IDTIMESTAMP标题是只读MessageHeaderAccessor):

protected boolean isReadOnly(String headerName) {
    return (MessageHeaders.ID.equals(headerName) || MessageHeaders.TIMESTAMP.equals(headerName));
}

它们是针对具体的Message指定的,它是不可变的

这些标题是为框架内​​部使用而设计的,无法更改。

对于像你这样的用例,需要引入加法businessKey并处理不考虑那些interlan标题的问题。

由于您在ID之后要求商店claim-ckeck以某种方式确定消息,我建议您使用MetadataStore来保留ID <-> businessKey以某种方式对将来有能力恢复它们。

当然,您可以尝试将MutableMessageBuilder用于特定用例:

MutableMessageBuilder.fromMessage(message)
            .setHeader(MessageHeaders.ID, UUID.randomUUID())
            .build()

ID无论如何都必须是UUID

正确:HeaderFilter也不会删除这些只读标头。

答案 1 :(得分:0)

I have overridden the http_requestMethod by doing as like below. The request coming is Post which I have removed from Headers and added PUT.


<int:header-filter input-channel="headerFilterChannel"
        header-names="http_requestMethod" output-channel="closeAndCloneOldTasksHeaderEnricherChannel" />

    <int:header-enricher input-channel="closeAndCloneOldTasksHeaderEnricherChannel"
        output-channel="caresToSfdc">
        <int:header name="http_requestMethod" value="PUT" />
    </int:header-enricher>

***Before Overriding Log*** 
GenericMessage [payload=com.cardinalhealth.chh.exception.model.GenericResponse@1948829c, headers={http_requestMethod=POST, replyChannel=org.springframework.messag

**After  Overriding Log :**
GenericResponse@142cd5fd, headers={replyChannel=org.springframework.messaging.core.GenericMessagingTemplate$TemporaryReplyChannel@5710c249, http_requestMethod=PUT,