Spring AMQP: CorrelationId изменяется между моментом отправки и получения сообщения

Пока я тестировал методы отправки и получения, которые я создал для своего проекта, я столкнулся со странной проблемой. Когда я отправляю определенное сообщение с использованием идентификатора корреляции, основанного на объекте UUID, принимающая сторона получает слегка измененную версию этого идентификатора корреляции (которая не может быть десериализована).

На стороне отправки я делаю это:

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

В моем последнем тесте был сгенерирован UUID: "d4170243-9e7e-4c42-9168-f9da4debc5bb"

Это генерирует следующий идентификатор корреляции (при сериализации):

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

Когда я получаю сообщение с другой стороны, этот идентификатор немного изменяется:

[-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 я заметил, что идентификатор уже изменился по прибытии в очередь.

введите здесь описание изображения

Отслеживание моего кода на стороне отправки приводит меня к опции отправки класса RabbitTemplate.

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

Но я не могу понять, что вызывает эту проблему. Я предполагаю, что это просто я неправильно использую опцию CorrelationId. Может ли кто-нибудь помочь мне?

Ценить это.


person Robin Hermans    schedule 10.04.2015    source источник
comment
Что делают MessageSerializer ? Сгенерированный массив байтов не является строго представлением массива байтов String#getByte().   -  person Nicolas Labrot    schedule 10.04.2015
comment
MessageSerializer — это специально созданный класс, который преобразует объекты в сериализованный массив байтов. Странно то, что он отлично работает с моими объектами полезной нагрузки. Но не для моего идентификатора корреляции.   -  person Robin Hermans    schedule 10.04.2015
comment
Поскольку идентификатор корреляции окончательно преобразуется обратно в строку, когда клиент создает сетевой фрейм (см. ссылку) Я боюсь, что ваша сериализация вводит не ascii-символ, который разрывает строку. Вы можете использовать простой UUID.randomUUID().toString().getByte()   -  person Nicolas Labrot    schedule 10.04.2015
comment
Это, кажется, исправить это. Хотя я как бы хочу знать, почему невозможно сначала сериализовать его, а затем отправить. Просто из интереса.   -  person Robin Hermans    schedule 10.04.2015


Ответы (1)


Объяснение следующее:

  1. Вы сериализуете строку UUID в массив байтов
  2. Ваша сериализация добавляет не ascii-символ к этому массиву ([-17, -65, -67, -17, -65, -67, 0, 5, 116, 0, 36,...])
  3. В справочной документации указано, что идентификатор корреляции короткая ул. Клиент RabbitMQ преобразует этот массив байтов в строку, используя new String(yourArray , "UTF-8").
  4. Символ, отличный от 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]
person Nicolas Labrot    schedule 10.04.2015