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. html第四节课

    css CSS(Cascading Style Sheet,叠层样式表),作用是美化HTML网页. /*注释区域*/    此为注释语法 一.样式表 (一)样式表的分类 1.内联样式表 和HTML联合 ...

  2. 09.正则表达式re-3.常用的匹配规则

    模式 描述 \w 匹配字母.数字及下划线 \W 匹配不是字母.数字及下划线的字符 \s 匹配任意空白字符,等价于[\t\n\r\f] \S 匹配任意非空字符 \d 匹配任意数字,等价于[0-9] \D ...

  3. 1. 构建第一个SpringBoot工程

    1.File -  New - Module 2.选项的是Spring Initializr(官方的构建插件,需要联网) ,一定要选择jdk 3.填写项目基本信息 Group:组织ID,一般分为多个段 ...

  4. 痛苦的Windows下的temp目录

    2007不能运行了,错误: [MSBuild Error] “DCC”任务意外失败. System.Configuration.ConfigurationErrorsException: 配置系统未能 ...

  5. 转载 - AC自动机算法

    出处:http://blog.csdn.net/niushuai666/article/details/7002823 AC自动机简介:  首先简要介绍一下AC自动机:Aho-Corasick aut ...

  6. 转载 - 算法实践——舞蹈链(Dancing Links)算法求解数独

    出处:http://www.cnblogs.com/grenet/p/3163550.html 在“跳跃的舞者,舞蹈链(Dancing Links)算法——求解精确覆盖问题”一文中介绍了舞蹈链(Dan ...

  7. spring boot @Transactional事物处理

    spring boot 添加事物使用 @Transactional注解 简单使用 在启动类上方添加 @EnableTransactionManagement注解 使用时直接在类或者方法上使用 @Tra ...

  8. 0214常用的SQL语句

    1MYSQL自己认为 \n 就是 换行. 如果想表达 \n 则用户必须以 \\n的方式来说明 SELECT CONCAT('"C:\\Program Files\\MySQL\\MySQL ...

  9. ExtJs之Ext.Model的MemoryProxy

    书上的代码已完全不可参考,只好按知识点从网上查资料一个一个实例 了. <!DOCTYPE html> <html> <head> <title>ExtJ ...

  10. [bzoj1084][SCOI2005]最大子矩阵_动态规划_伪·轮廓线dp

    最大子矩阵 bzoj-1084 SCOI-2005 题目大意:给定一个n*m的矩阵,请你选出k个互不重叠的子矩阵使得它们的权值和最大. 注释:$1\le n \le 100$,$1\le m\le 2 ...