背景:
SpringBoot自带一些机制可以实现RabbitMQ的开发使用,不过我们发现一个问题那就是,自带的RabbitTemplate机制就是可以实现一些对象的序列化传输,不过不是明文,所以看起来很不得方便,为了解决只个问题,我们可以进行自定义MQ的配置,可以有效实现序列化转为Json明文进行存储。
步骤:
1. 首先我们需要进行SpringBoot的相关RabbitMQ的开发配置:
a. 在application.properties配置文件中进行配置RabbitMQ的相关配置:
spring.rabbitmq.host=127.0.0.1
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest
#默认的端口号就是5672,可以不写。
spring.rabbitmq.port= 5672
b. 在Test测试文件中进行测试相关的接收发送操作
首先是点对点的单发模式:
@Autowired
//该模板是对RabbitMQ的开发操作基本的接口
RabbitTemplate rabbitTemplate;
@Test
void test01_send() {
/**
* @Description: convertAndSend 函数可以实现自动实现对象序列化
* @Param: []
* @return: void
* @Author: 葛春光
* @Date: 2020/7/23
*/
/**
* 点对点发送(direct)
*/
//将object自动转化为序列化字符串。
Map<String, Object> map = new HashMap<>();
map.put("msg", "Hello World!");
map.put("data", Arrays.asList("Hello", 123, true));
// Book book = new Book("三国演义","罗贯中");
rabbitTemplate.convertAndSend("exchange.direct", "gcg.news", map);
}
@Test
public void test02_receive() {
Object o = rabbitTemplate.receiveAndConvert("gcg.news");
if (o != null) {
System.out.println(o.getClass());
System.out.println("接收的对象:" + o.toString());
} else {
System.out.println("接收的对象:" + o.toString());
}
}
然后是fanout的广播发送(效果是在该路由器下绑定的所有的队列都会自动获取到数据):
/**
* 广播发送(fanout)
* fanout不区分路由key,所以可以随意的进行匹配,他会自动发送给所有的绑定非队列。
*/
@Test
public void Test02_send() {
rabbitTemplate.convertAndSend("exchange.fanout", "", new Book("三国", "罗贯中"));
}
最后就是存放在MQ中数据的情况(明显可以看出存放的数据为序列化后的数据,看起来很不方面):
c. 解决方式,在MyRabbitMQConfig中进行自定义(将自定义的配置放入Bean容器后会自动的进行启动,而不使用默认的方式进行启动):
@Configuration //配置类
/**
* @Description: 自己配置的MQ的配置类,可以实现对象直接转为Json 而不是乱码序列化
* @Param:
* @return:
* @Author: 葛春光
* @Date: 2020/7/23
*/
public class MyRabbitMQConfig {
@Bean
public MessageConverter messageConverter() {
return new Jackson2JsonMessageConverter();
}
}
注意:
关于MQ中存放的数据是乱码的问题,在SpringBoot1.x版本可以直接用上面的方式实现,不过在2.x版本不建议使用,因为可以存放在MQ中Json字符串,不过在消费者消费过程中会出现映射报错问题。
d. 按照前面的测试步骤可以看出,下面的存储的效果,如下所示: