convertAndSend не может быть отброшен, когда слушатель получает сообщение

#java #jackson #rabbitmq

#java #джексон #rabbitmq

Вопрос:

Я использую RabbitMQ для отправки сообщений в очередь, и у потребителя я получаю его, но я не могу его отбросить.

Когда я отправляю его, я делаю это.

 rabbitTemplate.convertAndSend("myExchange", "binding", MyObject);
  

MyObject в этом проекте создан пользовательский объект. В другом проекте я создал MyObject.class точно такой же (но я знаю, что сигнатура объекта не совпадает).

Преобразованный набор для моего слушателя следующий.

 Jackson2JsonMessageConverter jsonMessageConverter() {
    Jackson2JsonMessageConverter messageConverter = new Jackson2JsonMessageConverter();
    messageConverter.setClassMapper(classMapper());

    return messageConverter;
}

private ClassMapper classMapper() {
    DefaultClassMapper classMapper = new DefaultClassMapper();
    classMapper.setDefaultType(MyObject.class);
    return classMapper;
}
  

Итак, на моем слушателе следующий код не работает. Я заметил, что тело поставляется с [B@1232(byte[232] .

 @Override
public void onMessage(final Message message) {
    final MyObject myObject = (MyObject) messageConverter.fromMessage(message);
  

Как мне этого добиться?

Комментарии:

1. Ты должен получить ClassCastException . Это верно? Не могли бы вы опубликовать полную трассировку стека?

Ответ №1:

Поместите класс MyObject в отдельный jar. Ссылайтесь на этот новый jar как от отправителя, так и от получателя.

Дополнительная информация
Строка является объектом. Преобразуйте ваш объект в json (в виде строки) и передайте jsonString в качестве третьего параметра convertAndSend.

В получателе вы должны сделать что-то вроде этого:

 final String jsonString = (String) messageConverter.fromMessage(message);
  

Комментарии:

1. есть ли какой-нибудь способ не делиться ими?

2. не уверен. вы могли бы преобразовать объект в json, затем отправить json в виде сообщения (в виде строки), затем, на другом конце, получить строку и преобразовать ее из json в локально определенный, но с тем же классом members.

3. любой пример того, как это сделать?

4. пример чего? отправка json в виде сообщения? реализация двух классов, которые создают (и создаются из) один и тот же json?

5. в принципе, да, я использую convertAndSend… не уверен, как сделать то, что вы описали.

Ответ №2:

Убедитесь, что вы установили MessageConverter на стороне отправителя значение Jackson2JsonMessageConverter , если вы хотите использовать сообщение на стороне получателя в виде json.

 Jackson2JsonMessageConverter messageConverter = ...; // create and configure

rabbitTemplate.setMessageConverter(messageConverter);
rabbitTemplate.convertAndSend("myExchange", "binding", MyObject);
  

В противном случае для отправки сообщения используется значение по умолчанию SimpleMessageConverter .

Преобразователем по умолчанию является SimpleMessageConverter, который способен обрабатывать массивы байтов, строки и сериализуемые объекты в зависимости от заголовка типа содержимого сообщения.

Так что я предполагаю, что ваш MyObject есть Serializable , и значение по умолчанию MessageConverter сериализует его в массив байтов. Как вы сказали

Итак, на моем слушателе следующий код не работает. Я заметил, что тело поставляется с [B @ 1232(байт [232].