自己构建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)

java
@Test public void testSendMessage() { String queueName = "simple.queue"; String msg = "hello 连赛轩"; rabbitTemplate.convertAndSend(queueName, msg); }

🌟 解释:

  • 使用的是 convertAndSend(String destination, Object message) 方法;

  • Spring 会把 msg 当成一个 Java 对象;

  • 此时你已经设置了 Jackson2JsonMessageConverter,它会自动把 "hello 连赛轩" 序列化成 合法的 JSON 字符串格式:即 "\"hello 连赛轩\""(注意最外层还有引号);

  • RabbitMQ 收到的消息体是标准的 JSON 字符串;

  • 消费端也能正常反序列化为 String 对象(前提是你监听的是 String 类型)。

✅ 所以这个方法是 Jackson 转换器生效后的标准流程,能正常工作。


❌ 第二段代码:手动构建 Message

java
@Test public void test100w() { Message msg = MessageBuilder.withBody("hello".getBytes(StandardCharsets.UTF_8)) .setDeliveryMode(MessageDeliveryMode.NON_PERSISTENT) .build(); rabbitTemplate.convertAndSend("simple.queue", msg); }

🧨 问题出在哪?

  • 你直接构造了一个 原始的 AMQP Message 对象

  • 此时 Spring 不会再调用消息转换器(如 Jackson)来处理这个消息

  • 换句话说,你绕过了 Jackson 转换器,自己构造了一段 byte[];

  • 然而!你没有设置 MessagePropertiesContentType 或其他元信息;

  • 接收端仍然使用 Jackson2JsonMessageConverter 去“尝试反序列化为 JSON”;

  • 但你的消息只是 "hello",不是 JSON(没有引号),所以抛出如下异常:

text
Unrecognized token 'hello': was expecting (JSON String, Number, Object...)
posted @ 2025-07-14 20:55  连师傅只会helloword  阅读(17)  评论(0)    收藏  举报