2

我使用 redis 作为 spring-xd 分布式环境的消息存储。

我将消息头设置如下,

oufinalTreeMapsg1 = MessageBuilder.withPayload(treeMap).setHeader("columnNames", columnNames).build();

在检查处理器中收到的消息时,它只显示 id 和时间戳

发送时的标头

[Headers={columnNames=abc,def, id=74acf995-ec39-0e1c-a426-c9e27b1d47d6, timestamp=1406784568493}]

收到的标头

[Headers={id=aed8dc5b-5b24-d444-7583-c2da7a21d31c, timestamp=1406784568495}]

这里的 id 和时间戳是不同的,但有效负载是相同的。

请帮我解决这个问题,

在此先感谢,-Suyodha

4

1 回答 1

3

Redis 消息总线默认不支持传递自定义标头;<constructor-arg/>但是,您可以通过在redis-bus.xml(在 xd-dirt jar 中)的第三个中添加逗号分隔列表来将自定义标题添加到传递的标题中。例如...

<constructor-arg value="foo, bar" />

...将通过标题foobar.

然而,即便如此,也只能传递简单的字符串值。

在 Spring Integration(总线使用)中,消息是不可变的;当它们通过某种介质(例如 redis 消息总线)传输时,会使用内容创建一条新消息,但这些标头(id 和时间戳)会发生变化。

默认情况下RabbitMessageBus通过所有自定义标头。

更新

Redis 和 kafka 没有消息头或属性的概念。

redis 和 kafka 消息总线实现现在支持 servers.yml 中的属性,以将自定义标头添加到通过总线传输的标头。

默认情况下,仅传输一些系统级标头。

请参阅Redis (and Kafka) 中的headers:Application servers.ymlConfiguration 。

要传输的附加(字符串值)标头名称的逗号分隔列表

请注意,this (for redis) 错误地表示这些必须是字符串值的。最初是这种情况,但现在任何可以转换为/从 json 转换的对象都可以在标头值中。

此外,kafka 有一种raw模式,在这种情况下,根本不会通过总线传输任何标题;出于性能原因,这可能是需要的,但在此模式下不支持某些事情(如消息类型转换),因为框架无法确定类型。

于 2014-08-01T13:37:04.753 回答