Spring AMQP:CorrelationId 在发送和接收消息的时刻发生变化

Spring AMQP : CorrelationId changes between moment of sending and receiving a message

当我测试为我的项目创建的发送和接收方法时,我 运行 遇到了一个 st运行ge 问题。 当我使用基于 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 的发送选项 class。

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

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

欣赏。

解释如下:

  1. 您将 UUID 字符串序列化为字节数组
  2. 您的序列化将非 ascii 字符添加到此数组 ([-17, -65, -67, -17, -65, -67, 0, 5, 116, 0, 36,...])
  3. reference documentation 表示关联 ID 是短字符串。 RabbitMQ 客户端使用 new String(yourArray , "UTF-8")
  4. 非ascii字符"corrupt"byte[]到string的转换

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

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

哪个 return:

[-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]