#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;
}