RabbitMQ 中消息的序列化和反序列化通过实现 AMQP 的内容类型与编码来完成。
工作原理是:
- 生产者在发送消息前,需要先对消息进行序列化,得到字节数据。RabbitMQ只接收字节数据,不接收Java对象。
- 生产者在发送消息时,需要指定消息的内容类型,如”text/plain”。RabbitMQ将根据内容类型选择合适的编码来解析消息。
- 消费者接收到消息后,需要先判断消息内容类型,然后选择对应的解码器进行反序列化,得到Java对象。
- 通过序列化与反序列化,实现Java对象与RabbitMQ消息之间的转换,完成对象的传输。
示例代码:
生产者:
// 序列化,得到byte[]
byte[] messageBodyBytes = serializer.serialize(message);
// 发送消息,内容类型为"application/json"
channel.basicPublish("", queue, MessageProperties.PERSISTENT_TEXT_PLAIN,messageBodyBytes);
消费者:
// 获取消息内容类型
String contentType = msg.getMessageProperties().getContentType();
// 根据内容类型选择解码器进行反序列化
if (contentType.equals("application/json")) {
message = serializer.deserialize(msg.getBody(), Message.class);
}
- 生产者对消息对象message进行序列化,得到字节数组messageBodyBytes。
- 发送消息时,设置内容类型为”application/json”。
- 消费者接收到消息,获取其内容类型contentType。
- 判断内容类型为”application/json”,选择JSON解码器进行反序列化。
- 得到消息对象message,完成对象传输的效果。
所以总结来说,RabbitMQ 通过 AMQP 内容类型与编解码机制实现了 Java 对象与 MQ 消息之间的转换,实现了序列化与反序列化的效果。