为什么我不推荐你使用RabbitMQ的消息转换功能

改版:

创新互联是专业的乡宁网站建设公司,乡宁接单;提供成都网站建设、网站建设,网页设计,网站设计,建网站,PHP网站建设等专业做网站服务;采用PHP框架,可快速的进行乡宁网站开发网页制作和功能扩展;专业做搜索引擎喜爱的网站,专业的做网站团队,希望更多企业前来合作!

发送消息与订阅消息取消使用amqp提供的消息序列化与反序列化功能,使用String类型,发送消息时手动转化为json字符串再发送,消费消息时手动json反序列化。

背景:

如果使用自动序列化与反序列化功能,即给Rabbitmq配置Jackson2JsonMessageConverter消息转化器,当我们修改消息Body的java类型名称或者包名时,消费历史消息就会抛出ClassNotFoundException异常。

1、不做兼容上线,但需要:

  • 确保不会有新的消息进入队列;
  • 确保队列中的消息已经消费完。

2、粗暴方式,直接清空队列,丢弃历史消息;

3、做兼容,给旧消息创建一个类名匹配的消息Body类型,添加一个@RabbitHandler方法处理旧消息。

这是因为Rabbitmq为了实现一个队列支持多个方法消费(即@RabbitHandler注解的方法),每个方法消费不同Java类型的消息Body,在消费到消息时,就需要先反序列化出消息Body,才能根据消息Body的类型去匹配一个消费方法消费消息,如DelegatingInvocableHandler#invoke方法源码所示。

 
 
 
 
  1. // org.springframework.amqp.rabbit.listener.adapter.DelegatingInvocableHandler#invoke 
  2. public InvocationResult invoke(Message message, Object... providedArgs) throws Exception {  
  3.    // 获取消息body类型 
  4.    Class payloadClass = message.getPayload().getClass(); 
  5.    // 匹配的方法 
  6.    InvocableHandlerMethod handler = getHandlerForPayload(payloadClass); 
  7.    // 调用方法消费 
  8.    Object result = handler.invoke(message, providedArgs); 
  9.    //.... 

由于需要在匹配消息消费方法之前就需要解析出消息Body,也就是要先知道消息Body的Java类型才能实现json反序列化,这就要求消息生产者在发送消息时不得不在消息头添加一个参数表示消息Body的Java类型,如下图所示。

在消息消费阶段,Jackson2JsonMessageConverter也需要先根据消息头的TypeId获取JavaType,再执行反序列化操作,当类名修改时,或者生产者和消费者各自定义的类名不同,都将会导致反序列化失败。

除非确保消息Body的类名不会变,且生产者与消费者定义的完整类名相同,否则不建议使用自动序列化与反序列化功能。

本文转载自微信公众号「Java艺术」,作者wujiuye 。转载本文请联系Java艺术公众号。  

文章题目:为什么我不推荐你使用RabbitMQ的消息转换功能
分享链接:http://www.shufengxianlan.com/qtweb/news22/279872.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联