springboot配置rabbitmq的序列化反序列化格式

摘要:
SimpleMessageListenerContainer.messageListener的消息转换器将被调用以将消息转换为对象ObjectfromMessage(Messagemessage)Springboot。
SpringBoot封装了rabbitmq中,发送对象和接收对象时,会统一将对象和消息互相转换
会用到MessageConverter转换接口

在发送消息时,

会将Object转换成Message Message createMessage(Object object, MessageProperties messageProperties)

接收消息时

SimpleMessageListenerContainer容器监听消息时,会调用SimpleMessageListenerContainer.messageListener的消息转换器将Message转换成对象 Object fromMessage(Message message)

Springboot中,默认的rabbitMq的序列化类是:SimpleMessageConverter

SimpleMessageConverter
将Object对象 和 Message 互相转换的规则

如果是 byte[] 或者 String 类型,直接获取字节 String.getBytes(this.defaultCharset)
设置messageProperties的 contentType = text/plain

如果是其他对象,调用 SerializationUtils.serialize(object) 进行序列化
设置messageProperties的 contentType = application/x-java-serialized-object
这里存在一个问题
如果发送方: object类是 com.zwh.user
但是接受方没有这个路径的类时,会抛出异常,not found class
 
所以发送消息时,最好手动将消息转换成String

Jackson2JsonMessageConverter 转换器

序列化时,Object 转成 json字符串在设置到 Message.body()中。 调用的是 jackson的序列化方式
反序列化时,将 Message.body()内容反序列化成 Object
这个方式不会出现上面SimpleMessageConverter转换器的 not found class错误

如果项目中要统一的序列化格式, 需要显示声明 转换bean

@Bean
public Jackson2JsonMessageConverter producerJackson2MessageConverter() {
    return new Jackson2JsonMessageConverter();
}
因为自动配置类RabbitAutoConfiguration 和 RabbitAnnotationDrivenConfiguration
会自动获取Spring 容器中MessageConverter实现类bean数据
并将转换器设置到 RabbitTemplate 和 SimpleRabbitListenerContainerFactory.setMessageConverter() 中

RabbitAutoConfiguration 配置 发送端 RabbitTemplate 
RabbitAnnotationDrivenConfiguration 配置接收端 SimpleRabbitListenerContainerFactory
注意:如果 RabbitTemplate 配置的 jackson 序列化,而 listener没有配置(默认SimpleMessageConverter),则接受消息转换成object时将会报错
如下配置
@Bean
public RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory,
                                                 MessageProcess messageProcess) {
    ReliableRabbitTemplate template = new ReliableRabbitTemplate(messageProcess);
    template.setConnectionFactory(connectionFactory);

    template.setMessageConverter(new Jackson2JsonMessageConverter());
}

发送端:

ProjectInfoDto projectInfoDto = new ProjectInfoDto();
projectInfoDto.setId(String.valueOf(System.currentTimeMillis()));
projectInfoDto.setProjectName("测试项目");
rabbitTemplate.sendMsgAndSaveRecord(ProjectMqConstants.PROJECT_DELETE_QUEUE, projectInfoDto.getId(),
        ProjectMqConstants.CONTRACT_OR_PROJECT_EXCHANGE, ProjectMqConstants.PROJECT_DELETE_QUEUE,
        projectInfoDto);
监听器:下面的会抛出异常

@RabbitListener(bindings = @QueueBinding(
    value = @Queue(value = ProjectMqConstants.PROJECT_DELETE_QUEUE, durable = "true", autoDelete = "false"),
    exchange = @Exchange(value = ProjectMqConstants.CONTRACT_OR_PROJECT_EXCHANGE, type = ExchangeTypes.DIRECT),
    key = ProjectMqConstants.PROJECT_DELETE_QUEUE))
public void projectCanDelete(@Payload ProjectInfoDto data,
                             Message message,
                              Channel channel) {
                                  
 }

报错为:

ListenerExecutionFailedException: Listener method could not be invoked with the incoming message
Fatal message conversion error; message rejected; it will be dropped or routed to a dead letter exchange

消息转换错误,消息被拒绝

免责声明:文章转载自《springboot配置rabbitmq的序列化反序列化格式》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇mongoDB在windows下安装与配置方案ASP.NET MVC 文件上传和路径处理下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

数据储存——远程服务器存储——JSON

JSON 一.特点     1.JavaScript Object Notation     2.一种轻量级的数据交互格式 二.格式     1.[ ] 数组:[value1, value2, value3...]     2.{ } 对象:{key1:value1, key2:value2, key3:value3,...}       1-key:字符...

spark作业性能调优

spark作业性能调优 优化的目标 保证大数据量下任务运行成功 降低资源消耗 提高计算性能 一、开发调优: (1)避免创建重复的RDD RDD lineage,也就是“RDD的血缘关系链” 开发RDD lineage极其冗长的Spark作业时,创建多个代表相同数据的RDD,进而增加了作业的性能开销。 (2)尽可能复用同一个RDD 比如说,有一个RDD的...

10种常见安全漏洞浅析

1. SQL 注入 1.1 什么是SQL注入? SQL注入是一种代码注入技术,一般被应用于攻击web应用程序。它通过在web应用接口传入一些特殊参数字符,来欺骗应用服务器,执行恶意的SQL命令,以达到非法获取系统信息的目的。它目前是黑客对数据库进行攻击的最常用手段之一。 1.2 SQL注入是如何攻击的? 举个常见的业务场景:在web表单搜索框输入员工名字,...

【转载】C#的ArrayList使用IndexOf方法查找第一个符合条件的元素位置

在C#的编程开发中,ArrayList集合是一个常用的非泛型类集合,在ArrayList集合中如果需要查找第一个符合条件的元素所在的位置,可以使用ArrayList集合的IndexOf方法,IndexOf方法将会返回符合条件的第一个元素在集合中的索引位置信息,如果未查到符合条件的元素对象,则返回-1。 IndexOf方法的其中一个常用方法签名为:virtu...

RabbitMQ-C 客户端接口使用说明

  rabbitmq-c是一个用于C语言的,与AMQP server进行交互的client库。AMQP协议为版本0-9-1。rabbitmq-c与server进行交互前需要首先进行login操作,在操作后,可以根据AMQP协议规范,执行一系列操作。   这里,根据项目需求,只进行部分接口说明,文后附demo的github地址。 接口描述 接口说明:声明一...

jprofiler主要功能简介及内存泄漏分析示例

转:https://blog.csdn.net/huangjin0507/article/details/52452946 一、安装JProfiler        从http://www.ej-technologies.com/下载5.1.2并申请试用序列号   二、主要功能简介 1.内存剖析 Memory profiler JProfiler 的内...