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学习总结 ...
随机推荐
- python3使用465端口发送邮件来解决阿里云封闭25端口问题
import smtplibfrom email.mime.text import MIMETextfrom email.utils import formataddr #发件人邮箱账号my_send ...
- python的多版本安装以及常见错误(长期更新)
(此文长期更新)Python安装常见错误汇总 注:本教程以python3.6为基准 既然是总结安装过程中遇到的错误,就顺便记录一下我的安装过程好了. 先来列举一下安装python3.6过程中可能需要的 ...
- 16._source元数据
- (23)Spring Boot启动加载数据CommandLineRunner【从零开始学Spring Boot】
[Spring Boot 系列博客] )前言[从零开始学Spring Boot] : http://412887952-qq-com.iteye.com/blog/2291496 )spring bo ...
- 0419如何利用关系角度看待SQL
转自http://www.open-open.com/solution/view/1389339225820 十步完全理解SQL 1. SQL 是一种声明式语言 首先要把这个概念记在脑中:“声明” ...
- 介绍一个不错的服务器综合监控工具脚本集aspersa
http://blog.csdn.net/jackyrongvip/article/details/9217869
- [bzoj2529][Poi2011]Sticks_贪心
Sticks bzoj-2529 Poi-2011 题目大意:给你n根木棒,每种木棒有长度和颜色,颜色共有k种,求满足条件的3根木棒使得这3根木棒颜色互不相同且可以围成三角形. 注释:$1\le n ...
- cogs 9. 中心台站建设。。。
9. 中心台站建设 ★★☆ 输入文件:zpj.in 输出文件:zpj.out 简单对比时间限制:1 s 内存限制:128 MB [问题描述] n个城市之间有通讯网络,从这n个城 ...
- 手把手实现Java权限(1)-Shiro介绍
功能介绍 Authentication :身份认证/登录.验证用户是不是拥有对应的身份: Authorization :授权,即权限验证.验证某个已认证的用户是否拥有某个权限:即推断用 户能否做事 ...
- codechef Little Elephant and Bombs题解
The Little Elephant from the Zoo of Lviv currently is on the military mission. There are N enemy bui ...