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

时间:2015-04-10 12:09:41

标签: java rabbitmq spring-amqp

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

enter image description here

在发送方跟踪我的代码将我带到RabbitTemplate类的send选项。

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

但我无法弄清楚造成这个问题的原因。我想这只是我错误的方式使用correlationId选项。有人可以帮助我吗?

欣赏它。

1 个答案:

答案 0 :(得分:3)

说明如下:

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

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

    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]