在测试为项目创建的发送和接收方法时,遇到了一个奇怪的问题。
当我使用基于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]