您的位置:首页 > Web前端 > JavaScript

RabbitMQ学习之messageconver插件实现(Gson)

2016-04-21 16:33 597 查看
RabbitMQ已经实现了Jackson的消息转换(Jackson2JsonMessageConverter),由于考虑到效率,如下使用Gson实现消息转换。

如下消息的转换类的接口MessageConverter,Jackson2JsonMessageConverter的父类AbstractJsonMessageConverter针对json转换的基类。



我们实现Gson2JsonMessageConverter转换类也继承AbstractJsonMessageConverter。

引入Gson的pom

[html] view
plain copy

 print?





<dependency>  

            <groupId>com.google.code.gson</groupId>  

            <artifactId>gson</artifactId>  

            <version>2.3</version>  

        </dependency>  

转换类实现如下:

[java] view
plain copy

 print?





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);  

    }  

}  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  插件 json 继承 gson 框架