RabbitMQ学习之messageconver插件实现(Gson)
RabbitMQ已经实现了Jackson的消息转换(Jackson2JsonMessageConverter),由于考虑到效率,如下使用Gson实现消息转换。
如下消息的转换类的接口MessageConverter,Jackson2JsonMessageConverter的父类AbstractJsonMessageConverter针对json转换的基类。
我们实现Gson2JsonMessageConverter转换类也继承AbstractJsonMessageConverter。
引入Gson的pom
- <dependency>
- <groupId>com.google.code.gson</groupId>
- <artifactId>gson</artifactId>
- <version>2.3</version>
- </dependency>
转换类实现如下:
- package cn.slimsmart.rabbitmq.demo.spring.tag;
- import java.io.IOException;
- import java.io.UnsupportedEncodingException;
- import org.apache.commons.logging.Log;
- import org.apache.commons.logging.LogFactory;
- import org.springframework.amqp.core.Message;
- import org.springframework.amqp.core.MessageProperties;
- import org.springframework.amqp.support.converter.AbstractJsonMessageConverter;
- import org.springframework.amqp.support.converter.ClassMapper;
- import org.springframework.amqp.support.converter.DefaultClassMapper;
- import org.springframework.amqp.support.converter.MessageConversionException;
- import com.google.gson.Gson;
- public class Gson2JsonMessageConverter extends AbstractJsonMessageConverter {
- private static Log log = LogFactory.getLog(Gson2JsonMessageConverter.class);
- private static ClassMapper classMapper = new DefaultClassMapper();
- private static Gson gson = new Gson();
- public Gson2JsonMessageConverter() {
- super();
- }
- @Override
- protected Message createMessage(Object object,
- MessageProperties messageProperties) {
- byte[] bytes = null;
- try {
- String jsonString = gson.toJson(object);
- bytes = jsonString.getBytes(getDefaultCharset());
- }
- catch (IOException e) {
- throw new MessageConversionException(
- "Failed to convert Message content", e);
- }
- messageProperties.setContentType(MessageProperties.CONTENT_TYPE_JSON);
- messageProperties.setContentEncoding(getDefaultCharset());
- if (bytes != null) {
- messageProperties.setContentLength(bytes.length);
- }
- classMapper.fromClass(object.getClass(),messageProperties);
- return new Message(bytes, messageProperties);
- }
- @Override
- public Object fromMessage(Message message)
- throws MessageConversionException {
- Object content = null;
- MessageProperties properties = message.getMessageProperties();
- if (properties != null) {
- String contentType = properties.getContentType();
- if (contentType != null && contentType.contains("json")) {
- String encoding = properties.getContentEncoding();
- if (encoding == null) {
- encoding = getDefaultCharset();
- }
- try {
- Class<?> targetClass = getClassMapper().toClass(
- message.getMessageProperties());
- content = convertBytesToObject(message.getBody(),
- encoding, targetClass);
- }
- catch (IOException e) {
- throw new MessageConversionException(
- "Failed to convert Message content", e);
- }
- }
- else {
- log.warn("Could not convert incoming message with content-type ["
- + contentType + "]");
- }
- }
- if (content == null) {
- content = message.getBody();
- }
- return content;
- }
- private Object convertBytesToObject(byte[] body, String encoding,
- Class<?> clazz) throws UnsupportedEncodingException {
- String contentAsString = new String(body, encoding);
- return gson.fromJson(contentAsString, clazz);
- }
- }
RabbitMQ学习之messageconver插件实现(Gson)的更多相关文章
- 官网英文版学习——RabbitMQ学习笔记(十)RabbitMQ集群
在第二节我们进行了RabbitMQ的安装,现在我们就RabbitMQ进行集群的搭建进行学习,参考官网地址是:http://www.rabbitmq.com/clustering.html 首先我们来看 ...
- 官网英文版学习——RabbitMQ学习笔记(二)RabbitMQ安装
一.安装RabbitMQ的依赖Erlang 要进行RabbitMQ学习,首先需要进行RabbitMQ服务的安装,安装我们可以根据官网指导进行http://www.rabbitmq.com/downlo ...
- 消息队列之rabbitmq学习使用
消息队列之rabbitmq学习使用 1.RabbitMQ简介 1.1.什么是RabbitMQ? RabbitMQ是一个开源的消息代理和队列服务器,用来通过普通协议在完全不同的应用之间共享数据,Rabb ...
- RabbitMQ学习系列(四): 几种Exchange 模式
上一篇,讲了RabbitMQ的具体用法,可以看看这篇文章:RabbitMQ学习系列(三): C# 如何使用 RabbitMQ.今天说些理论的东西,Exchange 的几种模式. AMQP协议中的核心思 ...
- RabbitMQ学习系列(三): C# 如何使用 RabbitMQ
上一篇已经讲了Rabbitmq如何在Windows平台安装,还不了解如何安装的朋友,请看我前面几篇文章:RabbitMQ学习系列一:windows下安装RabbitMQ服务 , 今天就来聊聊 C# 实 ...
- RabbitMQ学习总结 第三篇:工作队列Work Queue
目录 RabbitMQ学习总结 第一篇:理论篇 RabbitMQ学习总结 第二篇:快速入门HelloWorld RabbitMQ学习总结 第三篇:工作队列Work Queue RabbitMQ学习总结 ...
- RabbitMQ学习总结 第一篇:理论篇
目录 RabbitMQ学习总结 第一篇:理论篇 RabbitMQ学习总结 第二篇:快速入门HelloWorld RabbitMQ学习总结 第三篇:工作队列Work Queue RabbitMQ学习总结 ...
- RabbitMQ学习总结 第二篇:快速入门HelloWorld
目录 RabbitMQ学习总结 第一篇:理论篇 RabbitMQ学习总结 第二篇:快速入门HelloWorld RabbitMQ学习总结 第三篇:工作队列Work Queue RabbitMQ学习总结 ...
- RabbitMQ学习总结 第四篇:发布/订阅 Publish/Subscribe
目录 RabbitMQ学习总结 第一篇:理论篇 RabbitMQ学习总结 第二篇:快速入门HelloWorld RabbitMQ学习总结 第三篇:工作队列Work Queue RabbitMQ学习总结 ...
随机推荐
- Let's Encrypt,免费好用的 HTTPS 证书
转自: https://imququ.com/post/letsencrypt-certificate.html?hmsr=toutiao.io&utm_medium=toutiao.io ...
- 多文件编程(day13)
多文件编程时一个文件里可以包含多个函数, 一个函数只能属于一个文件 多文件编程的步骤 .把所有函数分散在多个不同的源文件里 (主函数通常单独占一个文件) .为每个源文件编写一个配对的以.h作为 扩展名 ...
- SVN仓库导入文件
分两种: 1.导入文件版本库从0开始 (适合新项目) 2.将其他SVN服务器中的版本库导入进来,版本库继承原SVN服务器的(适合SVN版本库迁移) 第一种: #mkdir –p /home/code/ ...
- Windows 安装react native
1.下载node.js (https://nodejs.org/en/) 2.安装node.js,安装完成后按住 图标键+R ,输入CMD进入命令行终端,输入npm -v C:\Users\Admin ...
- codevs——T1169 传纸条
http://codevs.cn/problem/1169/ 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题解 查看运行结果 题目描述 De ...
- HDOJ 题目5097 Page Rank(矩阵运算,模拟)
Page Rank Time Limit: 3000/1500 MS (Java/Others) Memory Limit: 100000/100000 K (Java/Others) Tota ...
- 【软件project】之第五、六章总结
软件project的前几章各自是软件计划.需求分析.软件设计.整体的都规划好了以后,就该着手去实践了. 所谓的理论体系足够强大了以后,实践就显得尤为轻松.我们设计软件,实践当然就是用我已经计划好的语言 ...
- 从OTF字体文件里查找字体名称
for in ? 使用神器vim就好了. . . vim ./AKZIDENZGROTESK-COND.OTF
- POJ 3628 Bookshelf 2 题解
本题解法非常多,由于给出的数据特殊性故此能够使用DFS和BFS,也能够使用01背包DP思想来解. 由于一般大家都使用DFS,这里使用非常少人使用的BFS.缺点是比DFS更加耗内存,只是长处是速度比DF ...
- Could not read from remote repository.
今天换新电脑,忘了配置git环境,就去gitserver上代替码.然后一直报错,后来就又一次配置了git环境.步骤例如以下 damingwuage:Desktop damingwuage$ ssh-k ...