gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 19:58:48 26 4
gpt4 key购买 nike

我正在使用来自 的 claim 检查模式,但我希望使用自定义 ID 存储消息。这应该很容易,因为消息存储实现使用传入的消息头 ID 来存储消息。是否可以使用 header 丰富器或/和 header 过滤器覆盖消息 header id 的值?

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

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

要拥有自定义 ID,在声明 checkin 之前拥有标题丰富器就足够了,其中 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

最佳答案

其实IDTIMESTAMP标题是 只读 ( MessageHeaderAccessor ):

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

它们是为混凝土指定的 Message , 即 不可变 .

这些 header 是为框架内​​部使用而设计的,不能更改。

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

既然你说你想通过 ID 以某种方式确定一条消息从店后 claim-ckeck ,建议您考虑使用 MetadataStore保留 ID <-> businessKey对有能力在 future 以某种方式恢复它们。

当然,你可以尝试使用 MutableMessageBuilder对于您的特定用例:
MutableMessageBuilder.fromMessage(message)
.setHeader(MessageHeaders.ID, UUID.randomUUID())
.build()

但是 ID必须是 UUID反正。

右: HeaderFilter也不会删除那些只读 header 。

关于spring - 是否可以在spring集成中覆盖消息头ID的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27421906/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com