自己构建Message向rabbitmq发送消息的小发现
前提:我在生产者端设置了jackson消息转换器,把接收到的 Java 对象转换成 JSON 发送
在消费者端也设置了jackson消息转换器,把 JSON 转换回 Java 对象
问题:
我使用的是jackson消息转换器,为什么 @Test public void testSendMessage() { String queueName = "simple.queue"; String msg="hello 连赛轩"; rabbitTemplate.convertAndSend( queueName, msg); } 可以成功发送消息到队列,而下面的代码不行 @Test public void test100w(){ Message msg = MessageBuilder.withBody("hello".getBytes(StandardCharsets.UTF_8)) .setDeliveryMode(MessageDeliveryMode.NON_PERSISTENT).build(); rabbitTemplate.convertAndSend("simple.queue", msg); } 帮我解释一下
你的两个发送方式行为不同,尽管看起来都像是“发送字符串”,但由于 使用的是 Jackson 消息转换器(Jackson2JsonMessageConverter),它对这两种写法的处理方式差异很大。
✅ 第一段代码:convertAndSend(String routingKey, Object message)
🌟 解释:
-
使用的是
convertAndSend(String destination, Object message)方法; -
Spring 会把
msg当成一个 Java 对象; -
此时你已经设置了
Jackson2JsonMessageConverter,它会自动把"hello 连赛轩"序列化成 合法的 JSON 字符串格式:即"\"hello 连赛轩\""(注意最外层还有引号); -
RabbitMQ 收到的消息体是标准的 JSON 字符串;
-
消费端也能正常反序列化为
String对象(前提是你监听的是String类型)。
✅ 所以这个方法是 Jackson 转换器生效后的标准流程,能正常工作。
❌ 第二段代码:手动构建 Message
🧨 问题出在哪?
-
你直接构造了一个 原始的 AMQP
Message对象; -
此时 Spring 不会再调用消息转换器(如 Jackson)来处理这个消息;
-
换句话说,你绕过了 Jackson 转换器,自己构造了一段 byte[];
-
然而!你没有设置
MessageProperties的ContentType或其他元信息; -
接收端仍然使用
Jackson2JsonMessageConverter去“尝试反序列化为 JSON”; -
但你的消息只是
"hello",不是 JSON(没有引号),所以抛出如下异常:
浙公网安备 33010602011771号