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

1

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

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

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

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

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

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

Изображение 174551

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

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

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

Ценить это.

  • 0
    Что делают MessageSerializer ? Созданный байтовый массив не является строго представлением байтового массива в String # getByte ()
  • 0
    MessageSerializer - это пользовательский класс, который преобразует объекты в сериализованный байтовый массив. Странно то, что он отлично работает для моих полезных объектов. Но не для моей корреляции.
Показать ещё 2 комментария
Теги:
spring-amqp
rabbitmq

1 ответ

3
Лучший ответ

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

  1. Сериализуйте строку UUID в массив байтов
  2. Ваша сериализация добавляет символ не ascii к этому массиву ([-17, -65, -67, -17, -65, -67, 0, 5, 116, 0, 36,...]))
  3. В справочной документации указано, что идентификатор корреляции является shortstr. Клиент RabbitMQ преобразует этот массив байтов в строку, используя new String(yourArray, "UTF-8").
  4. Символ non ascii "испортил" преобразование из байта [] в строку

Вы можете получить тот же результат с помощью следующего кода:

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]

Ещё вопросы

Сообщество Overcoder
Наверх
Меню