java.lang.Исключение IllegalArgumentException при публикации сообщения с помощью RabbitTemplate

#java #spring-boot #rabbitmq #amqp

#java #весенняя загрузка #rabbitmq #amqp

Вопрос:

Я пытаюсь опубликовать сообщение в очереди с помощью RabbitTemplate (используя Spring Boot), и я получил это сообщение. Я уже пытался найти решение.

 Caused by: java.lang.IllegalArgumentException: SimpleMessageConverter only supports String, byte[] and Serializable payloads, received: com.example.demo.SimpleMessage
  

Возможно, эта часть кода может помочь

 @Override
    public void run(String...strings) throws Exception {

        SimpleMessage simpleMessage = new SimpleMessage();
        simpleMessage.setName("FirstMessage");
        simpleMessage.setDescription("simpleDescription");

        rabbitTemplate.convertAndSend("TestExchange", "testRouting", simpleMessage);
    }
  

Я ценю любое сотрудничество.

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

1. где-то SimpleMessageConverter.createMessage вызывается. Я не могу вспомнить, вызывает ли convertAndSend это для вас или нет.

2. Просматривая исходный код spring, convertAndSend вызывает, MessageConverter.toMessage который вызывает MessageConverter.createMessage , и поскольку это экземпляр, SimpleMessage мы получаем SimpleMessageConverter.createMessage .

3. Согласен с тем, что Дилан упомянул ниже. Вам нужно сделать ваш объект сериализуемым. Взгляните на некоторые примеры отправки сообщения, похожие на ваш вариант использования здесь. thepracticaldeveloper.com/2016/10/23 /…

Ответ №1:

Проблема в том, что ваш класс SimpleMessage не реализует Serializable .

RabbitTemplate.convertAndSend используется SimpleMessageConveter для преобразования вашего сообщения в сообщение amqp. Однако SimpleMessageConverter требуется, чтобы это сообщение реализовывало интерфейс Serializable .

Ваш SimpleMessage класс должен выглядеть следующим образом:

 public class SimpleMessage implements Serializable {
    ... your code here
}
  

Вы можете узнать больше о сериализуемых объектах здесь.

Ответ №2:

Есть другое решение: используйте другую реализацию MessageConverter вместо SimpleMessageConverter по умолчанию.

Например, Jackson2JsonMessageConverter:

 public RabbitTemplate jsonRabbitTemplate(ConnectionFactory connectionFactory, ObjectMapper mapper) {
    final var jsonRabbitTemplate = new RabbitTemplate(connectionFactory);
    jsonRabbitTemplate.setMessageConverter(new Jackson2JsonMessageConverter(mapper));
    return jsonRabbitTemplate;
}