3.9.2.1 引入依赖
显然,JDK序列化方式并不合适。我们希望消息体的体积更小、可读性更高,因此可以使用JSON方式来做序列化和反序列化。
在publisher和consumer两个服务的父工程中都引入依赖:
com.fasterxml.jackson.dataformat
jackson-dataformat-xml
2.9.10
注意,如果项目中引入了spring-boot-starter-web依赖,则无需再次引入Jackson依赖。
3.9.2.2 配置消息转换器
配置消息转换器,在publisher和consumer两个服务中添加一个Bean即可:
注意:MessageConverter要导入org.springframework.amqp.support.converter.MessageConverter
package com.itheima.consumer.config;
import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter;
import org.springframework.amqp.support.converter.MessageConverter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
- @author Mr.M
- @version 1.0
- @description mq配置类
@date 2024/8/13 19:28
*/
@Configuration
public class MesaageConfig {@Bean
public MessageConverter messageConverter() {// 定义消息转换器 Jackson2JsonMessageConverter jackson2JsonMessageConverter = new Jackson2JsonMessageConverter(); //设置消息id,自动生成一个id,可用于消息幂等性处理 jackson2JsonMessageConverter.setCreateMessageIds(true); return jackson2JsonMessageConverter;}
}
3.9.2.3 测试
此时,我们到MQ控制台删除object.queue中的旧的消息。然后再次执行刚才的消息发送的代码,到MQ的控制台查看消息结构:
3.9.3 消费者接收Object
我们在consumer服务中定义一个新的消费者,publisher是用Map发送,那么消费者也一定要用Map接收,格式如下:
@RabbitListener(queues = "object.queue")
public void listenSimpleQueueMessage(Map msg) throws InterruptedException {
System.out.println("消费者接收到object.queue消息:【" + msg + "】");
}
3.8 面试题
RabbitMQ 的工作模型有哪些?
如何解决MQ消息堆积问题?