我使用 redis 作为 spring-xd 分布式环境的消息存储。
我将消息标题设置如下,
oufinalTreeMapsg1 = MessageBuilder.withPayload(treeMap).setHeader("columnNames", columnNames).build();
在检查处理器中收到的消息时,它仅显示 id 和时间戳
发送时的 header
[Headers={columnNames=abc,def, id=74acf995-ec39-0e1c-a426-c9e27b1d47d6, timestamp=1406784568493}]
收到 header
[Headers={id=aed8dc5b-5b24-d444-7583-c2da7a21d31c, timestamp=1406784568495}]
这里的 id 和时间戳不同,但负载相同。
请帮我解决这个问题
提前致谢, -苏尤达
最佳答案
Redis消息总线默认不支持传递自定义 header ;但是,您可以通过在第三个 <constructor-arg/>
中添加逗号分隔的列表来将自定义 header 添加到传递的 header 中。在redis-bus.xml
(在 xd-dirt jar 里)。例如...
<constructor-arg value="foo, bar" />
...将传递 header foo
和bar
.
但是,即使如此,也只能传递简单的字符串值。
在 Spring Integration(由总线使用)中,消息是不可变的;当它们通过某种介质(例如 redis 消息总线)传输时,会使用内容创建一条新消息,但这些 header (id 和时间戳)将会更改。
RabbitMessageBus
默认情况下传递所有自定义 header 。
更新
Redis 和 kafka 没有消息头或属性的概念。
redis 和 kafka 消息总线实现现在支持servers.yml 中的属性,以将自定义 header 添加到通过总线传输的 header 。
默认情况下,仅传输一些系统级 header 。
参见headers:
在servers.yml
在 Redis (and Kafka) under Application Configuration .
comma-delimited list of additional (string-valued) header names to transport
请注意,this(对于 redis)错误地表示这些必须是字符串值。最初是这样,但现在任何可以与 json 相互转换的对象都可以位于 header 值中。
此外,kafka还有一个raw
模式,在这种情况下,根本不通过总线传送任何报头;出于性能原因,这可能是需要的,但在此模式下无法支持某些操作(例如消息类型转换),因为框架无法确定类型。
关于redis - Spring-xd redis 消息总线从消息中删除 header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25072967/