在测试为项目创建的发送和接收方法时,遇到了一个奇怪的问题。
当我使用基于UUID对象的correlationId发送某条消息时,接收方会获得此correlationId的稍作修改的版本(无法反序列化)。

在发送方,我这样做:

MessageProperties properties = new MessageProperties();
properties.setCorrelationId(MessageSerializer.serialize(UUID.randomUUID().toString()));


在我的上一个测试中,生成的UUID为:“ d4170243-9e7e-4c42-9168-f9da4debc5bb”

这将生成以下correlationId(序列化时):

[-84, -19, 0, 5, 116, 0, 36, 100, 52, 49, 55, 48, 50, 52, 51, 45, 57, 101, 55, 101, 45, 52, 99, 52, 50, 45, 57, 49, 54, 56, 45, 102, 57, 100, 97, 52, 100, 101, 98, 99, 53, 98, 98]


当我在另一侧收到消息时,此ID会稍作更改:

[-17, -65, -67, -17, -65, -67, 0, 5, 116, 0, 36, 100, 52, 49, 55, 48, 50, 52, 51, 45, 57, 101, 55, 101, 45, 52, 99, 52, 50, 45, 57, 49, 54, 56, 45, 102, 57, 100, 97, 52, 100, 101, 98, 99, 53, 98, 98]


使用RabbitMQ管理插件时,我注意到ID在到达队列时已经更改。



在发送方跟踪我的代码使我进入RabbitTemplate类的send选项。

RabbitTemplate template = new RabbitTemplate(connection);
template.setExchange("amq.direct");
template.setRoutingKey("some.route");
template.send(message);


但是我不知道是什么导致了这个问题。我猜只是我以错误的方式使用correlationId选项。有人可以帮我吗?

欣赏它。

最佳答案

解释如下:


您将UUID字符串序列化为字节数组
您的序列化会将非ASCII字符添加到此数组([-17, -65, -67, -17, -65, -67, 0, 5, 116, 0, 36,...]
reference documentation指出相关性id是shortstr。 RabbitMQ客户端使用以下命令将该字节数组转换为字符串
new String(yourArray , "UTF-8")
非ASCII字符“损坏”了从byte []到字符串的转换


您可以使用以下代码获得相同的结果:

new String(MessageSerializer.serialize(UUID.randomUUID().toString()) , "UTF-8").getByte("UTF-8")


哪个会返回:

[-17, -65, -67, -17, -65, -67, 0, 5, 116, 0, 36, 100, 52, 49, 55, 48, 50, 52, 51, 45, 57, 101, 55, 101, 45, 52, 99, 52, 50, 45, 57, 49, 54, 56, 45, 102, 57, 100, 97, 52, 100, 101, 98, 99, 53, 98, 98]

10-07 16:39