RabbitMQ已经实现了Jackson的消息转换(Jackson2JsonMessageConverter),由于考虑到效率,如下使用Gson实现消息转换。

如下消息的转换类的接口MessageConverter,Jackson2JsonMessageConverter的父类AbstractJsonMessageConverter针对json转换的基类。

我们实现Gson2JsonMessageConverter转换类也继承AbstractJsonMessageConverter。

引入Gson的pom

[html] view plaincopy print?
  1. <dependency>
  2. <groupId>com.google.code.gson</groupId>
  3. <artifactId>gson</artifactId>
  4. <version>2.3</version>
  5. </dependency>

转换类实现如下:

[java] view plaincopy print?
  1. package cn.slimsmart.rabbitmq.demo.spring.tag;
  2. import java.io.IOException;
  3. import java.io.UnsupportedEncodingException;
  4. import org.apache.commons.logging.Log;
  5. import org.apache.commons.logging.LogFactory;
  6. import org.springframework.amqp.core.Message;
  7. import org.springframework.amqp.core.MessageProperties;
  8. import org.springframework.amqp.support.converter.AbstractJsonMessageConverter;
  9. import org.springframework.amqp.support.converter.ClassMapper;
  10. import org.springframework.amqp.support.converter.DefaultClassMapper;
  11. import org.springframework.amqp.support.converter.MessageConversionException;
  12. import com.google.gson.Gson;
  13. public class Gson2JsonMessageConverter extends AbstractJsonMessageConverter {
  14. private static Log log = LogFactory.getLog(Gson2JsonMessageConverter.class);
  15. private static  ClassMapper classMapper =  new DefaultClassMapper();
  16. private static Gson gson = new Gson();
  17. public Gson2JsonMessageConverter() {
  18. super();
  19. }
  20. @Override
  21. protected Message createMessage(Object object,
  22. MessageProperties messageProperties) {
  23. byte[] bytes = null;
  24. try {
  25. String jsonString = gson.toJson(object);
  26. bytes = jsonString.getBytes(getDefaultCharset());
  27. }
  28. catch (IOException e) {
  29. throw new MessageConversionException(
  30. "Failed to convert Message content", e);
  31. }
  32. messageProperties.setContentType(MessageProperties.CONTENT_TYPE_JSON);
  33. messageProperties.setContentEncoding(getDefaultCharset());
  34. if (bytes != null) {
  35. messageProperties.setContentLength(bytes.length);
  36. }
  37. classMapper.fromClass(object.getClass(),messageProperties);
  38. return new Message(bytes, messageProperties);
  39. }
  40. @Override
  41. public Object fromMessage(Message message)
  42. throws MessageConversionException {
  43. Object content = null;
  44. MessageProperties properties = message.getMessageProperties();
  45. if (properties != null) {
  46. String contentType = properties.getContentType();
  47. if (contentType != null && contentType.contains("json")) {
  48. String encoding = properties.getContentEncoding();
  49. if (encoding == null) {
  50. encoding = getDefaultCharset();
  51. }
  52. try {
  53. Class<?> targetClass = getClassMapper().toClass(
  54. message.getMessageProperties());
  55. content = convertBytesToObject(message.getBody(),
  56. encoding, targetClass);
  57. }
  58. catch (IOException e) {
  59. throw new MessageConversionException(
  60. "Failed to convert Message content", e);
  61. }
  62. }
  63. else {
  64. log.warn("Could not convert incoming message with content-type ["
  65. + contentType + "]");
  66. }
  67. }
  68. if (content == null) {
  69. content = message.getBody();
  70. }
  71. return content;
  72. }
  73. private Object convertBytesToObject(byte[] body, String encoding,
  74. Class<?> clazz) throws UnsupportedEncodingException {
  75. String contentAsString = new String(body, encoding);
  76. return gson.fromJson(contentAsString, clazz);
  77. }
  78. }

转载于:https://www.cnblogs.com/telwanggs/p/7124809.html

RabbitMQ学习之messageconver插件实现(Gson)相关推荐

  1. rabbitmq 学习 之shovel 插件使用(22)

    转载自 https://yq.aliyun.com/articles/41807 为了方便工作中使用,对 RabbitMQ 的[Shovel]文档进行了翻译,鉴于自己水平有限,翻译中难免有纰漏产生,如 ...

  2. RabbitMQ学习笔记-RabbitMQ简介

    导语   RabbitMQ 是现在比较热门的消息中间件,在互联网行业和传统行业都有大量地使用.消息中间件有很多,RabbitMQ在高可靠.易扩展.高可用等方面都有很大的优势.在学习RabbitMQ的过 ...

  3. 官网英文版学习——RabbitMQ学习笔记(二)RabbitMQ安装

    一.安装RabbitMQ的依赖Erlang 要进行RabbitMQ学习,首先需要进行RabbitMQ服务的安装,安装我们可以根据官网指导进行http://www.rabbitmq.com/downlo ...

  4. RabbitMQ学习

    RabbitMQ学习 1.概述 用于进程通信的中间件. 优势: 劣势: 1.应用解耦:提高了系统容错性和可维护性 1.系统依赖越多不能保证MQ的高可用 2.异步提速:提升用户体验和系统吞吐量 2.复杂 ...

  5. RabbitMQ 学习笔记

    RabbitMQ 学习笔记 RabbitMQ 学习笔记 1. 中间件 1.1 什么是中间件 1.2 为什么要使用消息中间件 1.3 中间件特点 1.4 在项目中什么时候使用中间件技术 2. 中间件技术 ...

  6. Rabbitmq学习笔记(尚硅谷2021)

    Rabbitmq学习笔记 (尚硅谷) 1.MQ 的概念 1.1 什么是 MQ? 1.2 为什么要用 MQ? 削峰 解耦 异步 1.3 MQ 的分类 ActiveMQ Kafka RocketMQ Ra ...

  7. 乐行学院RabbitMQ学习教程 第一章 RabbitMQ介绍(可供技术选型时使用)

    乐行学院RabbitMQ学习教程 第一章 RabbitMQ介绍 RabbitMQ介绍 1.RabbitMQ技术简介 2.RabbitMQ其他扩展插件 2.1监控工具rabbitmq-managemen ...

  8. RabbitMQ学习笔记(高级篇)

    RabbitMQ学习笔记(高级篇) 文章目录 RabbitMQ学习笔记(高级篇) RabbitMQ的高级特性 消息的可靠投递 生产者确认 -- confirm确认模式 生产者确认 -- return确 ...

  9. 消息代理 - RabbitMQ - 学习/实践

    1.应用场景 用于在分布式系统中存储转发消息,在易用性.扩展性.高可用性等方面表现不俗. 2.学习/操作 1. 文档 Messaging that just works - RabbitMQ // 官 ...

最新文章

  1. ehshig蒙文歌曲_ehshig蒙古音乐盒2017下载
  2. 程序员面试题精选100题(33)-在O(1)时间删除链表结点[数据结构]
  3. Java17-day08【File(创建和删除文件、判断和获取功能、遍历目录)、IO流(字节流写数据、异常处理、字节流读数据、复制文本文件、复制图片)】
  4. B. Light It Up
  5. 前端学习(682):switch和if else if
  6. hdu 1995 汉诺塔
  7. 【cocos2d-x 3.7 飞机大战】 决战南海I (三) 敌机实现
  8. Windows API Unicode 和 多字节转化demo
  9. 骁龙845_性能强大价格更吸引 超值骁龙845手机盘点
  10. FlashFXP注册码、密钥
  11. 《剑来》语句摘录(六)
  12. 虚拟主播合成视频使用教程
  13. C++流式输入输出加速 给 cin/cout 装个小火箭
  14. PC端如何使用ADB无线连接Android手机
  15. 论文阅读_(GIN)How Powerful are Graph Neural Networks
  16. 35_pytorch 过拟合解决办法 (Early Stop, Dropout)
  17. matlab 数组显示图片,20.1.4 显示图像数据
  18. AWVS 网页漏洞扫描工具安装使用(Linux)
  19. java版扫雷游戏源代码
  20. A script engine for the specified language can not be created

热门文章

  1. 关于嵌入式可执行程序,你了解多少?
  2. NameNode之数据块管理
  3. mysql 多实例 ERROR 2002 ERROR 1045
  4. html 缩小页面 重叠,如何获得两个平行四边形完美重叠并在HTML中动态调整大小?...
  5. RTT学习笔记2-线程
  6. Linux环境编译动态库和静态库总结
  7. STM32 输入捕获功能
  8. Linux内核分析 - 网络[十五]:陆由表[再议]
  9. ROS下多个kinect在一台电脑上同时运行
  10. lisp 提取字符串中的數字_Redis 数据结构之字符串的那些骚操作