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

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

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

引入Gson的pom

  1. <dependency>
  2. <groupId>com.google.code.gson</groupId>
  3. <artifactId>gson</artifactId>
  4. <version>2.3</version>
  5. </dependency>

转换类实现如下:

  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. }

RabbitMQ学习之messageconver插件实现(Gson)的更多相关文章

  1. 官网英文版学习——RabbitMQ学习笔记(十)RabbitMQ集群

    在第二节我们进行了RabbitMQ的安装,现在我们就RabbitMQ进行集群的搭建进行学习,参考官网地址是:http://www.rabbitmq.com/clustering.html 首先我们来看 ...

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

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

  3. 消息队列之rabbitmq学习使用

    消息队列之rabbitmq学习使用 1.RabbitMQ简介 1.1.什么是RabbitMQ? RabbitMQ是一个开源的消息代理和队列服务器,用来通过普通协议在完全不同的应用之间共享数据,Rabb ...

  4. RabbitMQ学习系列(四): 几种Exchange 模式

    上一篇,讲了RabbitMQ的具体用法,可以看看这篇文章:RabbitMQ学习系列(三): C# 如何使用 RabbitMQ.今天说些理论的东西,Exchange 的几种模式. AMQP协议中的核心思 ...

  5. RabbitMQ学习系列(三): C# 如何使用 RabbitMQ

    上一篇已经讲了Rabbitmq如何在Windows平台安装,还不了解如何安装的朋友,请看我前面几篇文章:RabbitMQ学习系列一:windows下安装RabbitMQ服务 , 今天就来聊聊 C# 实 ...

  6. RabbitMQ学习总结 第三篇:工作队列Work Queue

    目录 RabbitMQ学习总结 第一篇:理论篇 RabbitMQ学习总结 第二篇:快速入门HelloWorld RabbitMQ学习总结 第三篇:工作队列Work Queue RabbitMQ学习总结 ...

  7. RabbitMQ学习总结 第一篇:理论篇

    目录 RabbitMQ学习总结 第一篇:理论篇 RabbitMQ学习总结 第二篇:快速入门HelloWorld RabbitMQ学习总结 第三篇:工作队列Work Queue RabbitMQ学习总结 ...

  8. RabbitMQ学习总结 第二篇:快速入门HelloWorld

    目录 RabbitMQ学习总结 第一篇:理论篇 RabbitMQ学习总结 第二篇:快速入门HelloWorld RabbitMQ学习总结 第三篇:工作队列Work Queue RabbitMQ学习总结 ...

  9. RabbitMQ学习总结 第四篇:发布/订阅 Publish/Subscribe

    目录 RabbitMQ学习总结 第一篇:理论篇 RabbitMQ学习总结 第二篇:快速入门HelloWorld RabbitMQ学习总结 第三篇:工作队列Work Queue RabbitMQ学习总结 ...

随机推荐

  1. SQL第二节课

    SQL练习题 一.            设有一数据库,包括四个表:学生表(Student).课程表(Course).成绩表(Score)以及教师信息表(Teacher).四个表的结构分别如表1-1的 ...

  2. 数据持久层(DAO)通用API的实现

    在Web开发中,一般都分3层.Controller/Action 控制层,Service/Business 服务层/业务逻辑层,Dao 数据访问层/数据持久层. 在学习和工作的实践过程中,我发现很多功 ...

  3. Java Web学习总结(28)——Java Web项目MVC开源框架SSH和SSM比较

    SSH和SSM定义 SSH 通常指的是 Struts2 做控制器(controller),spring 管理各层的组件,hibernate 负责持久化层. SSM 则指的是 SpringMVC 做控制 ...

  4. Xamarin Mono For Android、Monotouch 安装

    一.Windows下面的安装 1. 安装环境介绍:    Win8.1 企业版64位或Win7 64.VS2013 update4 2. 安装jdk    到oracle官方下载jdk-8u45-wi ...

  5. 网页设计——Dreamweaver

    在看ASP.NET视频时,讲到了一款编写HTML代码的软件--Dreamweaver.它是一款专门进行网页设置的软件.通过它能够设计出多彩的界面,相对于vs中自带的设计方式来说,他不须要知道太多的技术 ...

  6. ubuntu查看文件大小

    使用linux命令df 和du,df 但是df只能查看一级文件夹大小.使用比例.档案系统及其挂入点,但对文件却无能为力.du可以查看文件及文件夹的大小.所以基本上是两者配合使用. 一 df h参数, ...

  7. VS2013+ffmpeg开发环境搭建-->【转】

    本文转载自:http://blog.csdn.net/qq_28425595/article/details/51488869 版权声明:本文为博主原创文章,未经博主允许不得转载. 今天整理资料时,发 ...

  8. Spring中JdbcTemplate中使用RowMapper

    转自:https://blog.csdn.net/u012661010/article/details/70049633 1 sping中的RowMapper可以将数据中的每一行数据封装成用户定义的类 ...

  9. 第6章 Spring MVC的数据转换、格式化和数据校验

    使用ConversionService转换数据 <%@ page language="java" contentType="text/html; charset=U ...

  10. Wannafly挑战赛25 C 期望操作数 数学

    题目 题意:给你你一个数x和一个数q,x<=q,每一次可以等概率把x变成[x,q]中任意一个数,问变成q的步数的期望,输出对998244353取模,多组询问 题解:首先肯定的是,可以预处理,因为 ...