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学习总结 ...
随机推荐
- (C/C++学习)3.C++中cin的成员函数(cin.get();cin.getine()……)
说明:流输入运算符,在一定程度上为C++程序的开发提供了很多便利,我们可以避免C语言那种繁琐的输入格式,比如在输入一个数值时,还需指定其格式,而cin以及cout则不需要.但是cin也有一些缺陷,比如 ...
- python-flask-1
https://askubuntu.com/questions/244641/how-to-set-up-and-use-a-virtual-python-environment-in-ubuntu ...
- 47.serch基本语法
主要知识点 1._search api基本语法 2.http协议中get请求带上request body 一.search api的基本语法 1.GET /_search {所传递的参 ...
- 百度之星2014初赛 - 1002 - Grids
先上题目: Grids Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others)Tota ...
- elasticsearch6.4中文文档
男朋友翻译的,我这边做一个查看入口,分享给大家,O(∩_∩)O哈哈~ 版权声明:本文为博主原创文章,无需授权即可转载,甚至无需保留以上版权声明,转载时请务必注明作者. https://blog.csd ...
- git 强制pull
git fetch --all git reset --hard origin/master git pull
- ExtJs之Ext.grid.GridPanel(部分未完)
今天在家休息,年假不用就作费啊. 看了几部香港老电影,陪爸爸看了勇士占奇才, 然后,测试了一下EXTJS未完的内容, 在京东上订了七本历史普及书,近两百块..:) 搞定. <!DOCTYPE h ...
- EXTJS之DATA PROXY READER
这是不依赖于STORE的读取.我测试了很久,原来在新版本的EXTJS里.modelmanager.getmodel之类的不用了. 更改为静态的LOAD办法. <!DOCTYPE html> ...
- POJ 1155
很久以前做的树形DP题,今天再遇到时,竟然不会了,所以写写.. 设数组: prf[MAX][MAX],cost[MAX],sum[MAX].分别表示,在第i个结点为根的子树内的情况下,若有j个用户申请 ...
- [Cypress] Get started with Cypress
Adding Cypress to a project is a simple npm install away. We won’t need any global dependencies beyo ...