RabbitMQ消息转换器
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |
文章目录
RabbitMQ消息转换器
在SpringAMQP的发送方法中发送消息和接受消息的类型都是Object也就是说我们可以发送任意对象类型的消息SpringAMQP都会帮我们把发送的消息序列化为字节后再进行发送。下面我们可以演示一下
假设我们现在有个User类如下切记一定要实现Serializable接口才能被jdk序列化和反序列化
@Data
public class User implements Serializable {
private String name;
private Integer age;
private Date birthday;
}
然后我们在监听服务中注册一个名为 “object.queue” 的队列。
@Configuration
public class FanoutConfig {
@Bean
public Queue objectQueue(){
return new Queue("object.queue");
}
}
然后启动我们的监听服务可以看到在RabbitMq上已经可以看到我们刚才新建的队列了
为了观察我们发送到RabbitMQ的对象我们这里先把监听服务关掉。
然后我们编写一个发送消息的测试方法如下
@Test
public void testObject(){
//接受的队列名称
String queueName = "object.queue";
//新建对象
User user = new User();
user.setName("张三");
user.setAge(1);
user.setBirthday(new Date());
rabbitTemplate.convertAndSend(queueName, user);
}
编写完成后我们运行该方法。然后我们到rabbitMq上面看一下接收到的消息
这里我们可以看到我们的content_type的值是 application/x-java-serialized-object Java序列化对象。
此时我们启动我们的监听服务可以接收到消息如下
上面我们虽然也可以成功发送和接收对线但是默认的基于JDK做的序列化存在下列问题
- 数据体积过大
- 有安全漏洞
- 可读性差
因此我们正常使用的情况下我们不会使用默认的JDK的序列化而是会用我们的JSON转换器。
这里说明一下Spring的队列消息对象的处理是由 MessageConverter 来处理的而默认实现是 SimpleMessageConverter该类基于 JDK 的 ObjectOutputStream 完成序列化。
如果我们在我们的配置类中注册一个 MessageConverter 类型的 Bean 即可。推荐使用 JSON 方式序列化步骤如下
在 发送服务 和 接收服务 中都引入我们的依赖
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-xml</artifactId>
<version>2.9.10</version>
</dependency>
然后我们在 发送服务 和 接收服务 的启动类中添加我们的Bean如下
这里返回的 MessageConverter 必须是amqp包下的 MessageConverter。import org.springframework.amqp.support.converter.MessageConverter
@Bean
public MessageConverter messageConverter(){
return new Jackson2JsonMessageConverter();
}
为了看我们发送到rabbitMq的消息的形式这里我们还是把消费者服务先停掉然后重新运行我们刚才发送User对象的测试方法。
发送成功后我们获取我们的Message可以看到此时的content_type是 application/json而消息的可读性也变高了细心的小伙伴应该也可以看到这里需要的字节数也变少了。
然后我们重新启动我们的消费者服务再次观察结果如下