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. 类型转换、分支(day05)

    如果表达式里包含多个不同类型的数字就必须 首先把它们转换成同一个类型然后才能 计算 这个转换过程叫做隐式类型转换,完全由 计算机完成 隐式类型转换过程中一定把占地小的类型转换 成占地大的类型 如果不同 ...

  2. 5.win上安装ES

    安装步骤如下: 1.安装JDK 至少1.8.0_73以上版本,使用 java -version 这个命令进行查看java的版本 2.下载和解压缩Elasticsearch安装包, 解压后目录结构: 3 ...

  3. 解读grub.conf文件

    我们将来看看grub.conf文件内语句,(注:...)内的东西是我们的解读内容. # grub.conf generated by anaconda # # Note that you do not ...

  4. FaceBook推出的Android图片载入库-Fresco

    欢迎关注ndroid-tech-frontier开源项目,定期翻译国外Android优质的技术.开源库.软件架构设计.測试等文章 原文链接:Introducing Fresco: A new imag ...

  5. js限制checkbox选中个数

    今天在做项目时,碰到一个问题,我须要展示多个checkbox复选框,而仅仅能同意最多选6个.调试了老半天.最终出来了,代码例如以下: <SCRIPT LANGUAGE="JavaScr ...

  6. 初探BurpSuite

    BurpSuite这套渗透软件.或者已经能够说是渗透攻击平台了吧,玩的好.确实非常方便. 就像是玩英雄联盟的ADC,一開始玩VN.感觉非常难上手,玩多了肯定会爱上VN(啊,貌似提到了什么奇怪的东西). ...

  7. Squares-暴力枚举或者二分

    B - Squares Time Limit:3500MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit  ...

  8. java生成一张图片

    public class CreateImage { public static void main(String[] args) throws Exception{ int width = 100; ...

  9. 用python阐释工作量证明(proof of work)

    了解比特币的都知道挖矿非常耗电,这是由于比特币用到了工作量证明. 工作量证明是指系统为达到某目标而设置的工作度量方法.一開始是用在网络攻防上,大大提高攻击者的计算量,攻击成本也就上去了. 工作量证明须 ...

  10. poj1179 区间dp(记忆化搜索写法)有巨坑!

    http://poj.org/problem?id=1179 Description Polygon is a game for one player that starts on a polygon ...