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. [置顶] Every Programmer Should Know These Latency Numbers

    转自:   https://dzone.com/articles/every-programmer-should-know Every Programmer Should Know These Lat ...

  2. linux系统中给mysql配置环境变量

    安装过程就不写了,记得安装的路径就行,接下来要用到. 修改配置文件 vim /etc/profile 设置环境变量 写一个MYSQL_HOME,值为“mysql的安装路径” 在PATH后面加上$MYS ...

  3. 自定义UEditor右键菜单

    //打开右键菜单功能 ,enableContextMenu: true //右键菜单的内容,label留空支持国际化,否则以此配置为准 //,contextMenu:[ // { // label:' ...

  4. PHP统计当前在线用户数实例

    HTML 我们在页面上放置一个显示当前在线人数的div#total以及一个用于展示访客地区分布的列表#onlinelist,默认我们在列表中放置一张与加载动画图片,后面我们用jQuery控制当鼠标滑向 ...

  5. Keil

    Keil C51 V9.00 即09年发布的最新版本uVision 4,版本外观改变比较大,可以使用以前的注册文件.如果全新安装,在VISTA或者WIN 7系统下,请使用管理员方式运行,然后注册即可无 ...

  6. elementUI 时间选择器,时间选择快捷键

    elementUI的时间快捷键,使用属性:picker-options="pickerOptions",由于pickerOptions的定义很长,也在其他地方共用,因此建议提取出来 ...

  7. 【 Codeforces Round #519 by Botan Investments B】Lost Array

    [链接] 我是链接,点我呀:) [题意] [题解] 枚举k 不难根据a得到x[0..k-1] 然后再根据a[k+1..n]来验证一下得到的x是否正确就好. [代码] #include <bits ...

  8. 转载 - C++ bitset类使用与简介

    出处:http://blog.163.com/lixiangqiu_9202/blog/static/53575037201251121331412/ C++ bitset类的使用与简介   有些程序 ...

  9. 小记——Grub Rescue恢复

    下面我要讲的是一个悲伤的故事 引子 电脑状况简介:两块硬盘(1HHD.1SSD),SSD上装了LINUX(40G)+WIN10(50G)的双系统,SSD剩余部分在WIN下使用装程序,HHD做仓库.LI ...

  10. 1103 N的倍数

    1103 N的倍数  题目来源: Ural 1302 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题  收藏  关注 一个长度为N的数组A,从A中选出若干个数,使得 ...