我正在使用spring-integration中的声明检查模式,但我希望将消息与自定义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
答案 0 :(得分:2)
实际上ID
和TIMESTAMP
标题是只读(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,