7.rabbitmq之GSON

来源:互联网 发布:csbte后坐力数据 编辑:程序博客网 时间:2024/05/22 03:28

下面我们通过一个实例看一下rabbit的使用。

1.实现一个消息监听器ReceiveMessageListener.Java

[java] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1. package org.springframework.amqp.core;  
  2.   
  3. /** 
  4.  * Listener interface to receive asynchronous delivery of Amqp Messages. 
  5.  * 
  6.  * @author Mark Pollack 
  7.  */  
  8. public interface MessageListener {  
  9.   
  10.     void onMessage(Message message);  
  11.   
  12. }  

2.消费者配置Consumer.xml

[html] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3.        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  4.        xmlns:context="http://www.springframework.org/schema/context"  
  5.        xmlns:rabbit="http://www.springframework.org/schema/rabbit"  
  6.        xsi:schemaLocation="  
  7.             http://www.springframework.org/schema/beans  
  8.                 http://www.springframework.org/schema/beans/spring-beans.xsd  
  9.             http://www.springframework.org/schema/context  
  10.                 http://www.springframework.org/schema/context/spring-context.xsd  
  11.             http://www.springframework.org/schema/rabbit  
  12.                 http://www.springframework.org/schema/rabbit/spring-rabbit-1.0.xsd">  
  13.    
  14.    <!-- 连接服务配置  -->  
  15.     <rabbit:connection-factory id="connectionFactory" host="192.168.36.102" username="admin"  
  16.         password="admin" port="5672" virtual-host="/"  channel-cache-size="5" />  
  17.            
  18.    <rabbit:admin connection-factory="connectionFactory"/>  
  19.      
  20.    <!-- queue 队列声明-->  
  21.    <rabbit:queue durable="true" auto-delete="false" exclusive="false" name="spring.queue.tag"/>  
  22.       
  23.       
  24.    <!-- exchange queue binging key 绑定 -->  
  25.     <rabbit:direct-exchange name="spring.queue.exchange" durable="true" auto-delete="false">  
  26.         <rabbit:bindings>  
  27.             <rabbit:binding queue="spring.queue.tag" key="spring.queue.tag.key"/>  
  28.         </rabbit:bindings>  
  29.     </rabbit:direct-exchange>  
  30.       
  31.     <bean id="receiveMessageListener"  
  32.         class="cn.slimsmart.rabbitmq.demo.spring.tag.ReceiveMessageListener" />  
  33.        
  34.     <!-- queue litener  观察 监听模式 当有消息到达时会通知监听在对应的队列上的监听对象-->  
  35.     <rabbit:listener-container connection-factory="connectionFactory" acknowledge="auto" >  
  36.         <rabbit:listener queues="spring.queue.tag" ref="receiveMessageListener" />  
  37.     </rabbit:listener-container>  
  38. </beans>  
3.生产者配置Producer.xml

[html] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"  
  4.     xmlns:rabbit="http://www.springframework.org/schema/rabbit"  
  5.     xsi:schemaLocation="  
  6.             http://www.springframework.org/schema/beans  
  7.                 http://www.springframework.org/schema/beans/spring-beans.xsd  
  8.             http://www.springframework.org/schema/context  
  9.                 http://www.springframework.org/schema/context/spring-context.xsd  
  10.             http://www.springframework.org/schema/rabbit  
  11.                 http://www.springframework.org/schema/rabbit/spring-rabbit-1.0.xsd">  
  12.   
  13.     <!-- 连接服务配置 -->  
  14.     <rabbit:connection-factory id="connectionFactory"  
  15.         host="192.168.36.102" username="admin" password="admin" port="5672"  
  16.         virtual-host="/" channel-cache-size="5" />  
  17.   
  18.     <rabbit:admin connection-factory="connectionFactory" />  
  19.   
  20.     <!-- queue 队列声明 -->  
  21.     <rabbit:queue  durable="true"  
  22.         auto-delete="false" exclusive="false" name="spring.queue.tag" />  
  23.   
  24.   
  25.     <!-- exchange queue binging key 绑定 -->  
  26.     <rabbit:direct-exchange name="spring.queue.exchange"  
  27.         durable="true" auto-delete="false">  
  28.         <rabbit:bindings>  
  29.             <rabbit:binding queue="spring.queue.tag" key="spring.queue.tag.key" />  
  30.         </rabbit:bindings>  
  31.     </rabbit:direct-exchange>  
  32.   
  33.     <!-- spring amqp默认的是jackson 的一个插件,目的将生产者生产的数据转换为json存入消息队列,由于Gson的速度快于jackson,这里替换为Gson的一个实现 -->  
  34.     <bean id="jsonMessageConverter"  
  35.         class="cn.slimsmart.rabbitmq.demo.spring.tag.Gson2JsonMessageConverter" />  
  36.   
  37.     <!-- spring template声明 -->  
  38.     <rabbit:template id="amqpTemplate" exchange="spring.queue.exchange"  routing-key="spring.queue.tag.key"  
  39.         connection-factory="connectionFactory" message-converter="jsonMessageConverter" />  
  40. </beans>  
4.消费者启动类ConsumerMain.java

[java] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1. package cn.slimsmart.rabbitmq.demo.spring.tag;  
  2.   
  3. import org.springframework.context.support.ClassPathXmlApplicationContext;  
  4.   
  5. public class ConsumerMain {  
  6.   
  7.     public static void main(String[] args) {  
  8.         new ClassPathXmlApplicationContext("Consumer.xml");    
  9.     }  
  10. }  
5.生产者启动类ProducerMain.java

[java] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1. package cn.slimsmart.rabbitmq.demo.spring.tag;  
  2.   
  3. import org.springframework.amqp.core.AmqpTemplate;  
  4. import org.springframework.amqp.rabbit.core.RabbitTemplate;  
  5. import org.springframework.context.ApplicationContext;  
  6. import org.springframework.context.support.ClassPathXmlApplicationContext;  
  7.   
  8. public class ProducerMain {  
  9.       
  10.     public static void main(String[] args) {  
  11.         ApplicationContext context = new ClassPathXmlApplicationContext("Producer.xml");    
  12.         AmqpTemplate amqpTemplate = context.getBean(RabbitTemplate.class);     
  13.         User user = new User();  
  14.         user.setName("niuniu");  
  15.         amqpTemplate.convertAndSend(user);  
  16.     }  
  17. }  

先启动消费者,监听接收消息,再启动生产者发送消息。

输出: data :{"name":"niuniu"}

如下4中转发器类型标签

rabbit:fanout-exchange

rabbit:direct-exchange

rabbit:topic-exchange

rabbit:headers-exchange




RabbitMQ已经实现了Jackson的消息转换(Jackson2JsonMessageConverter),由于考虑到效率,如下使用Gson实现消息转换。

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


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

引入Gson的pom

[html] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1. <dependency>  
  2.             <groupId>com.google.code.gson</groupId>  
  3.             <artifactId>gson</artifactId>  
  4.             <version>2.3</version>  
  5.         </dependency>  
转换类实现如下:

[java] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1. package cn.slimsmart.rabbitmq.demo.spring.tag;  
  2.   
  3. import java.io.IOException;  
  4. import java.io.UnsupportedEncodingException;  
  5.   
  6. import org.apache.commons.logging.Log;  
  7. import org.apache.commons.logging.LogFactory;  
  8. import org.springframework.amqp.core.Message;  
  9. import org.springframework.amqp.core.MessageProperties;  
  10. import org.springframework.amqp.support.converter.AbstractJsonMessageConverter;  
  11. import org.springframework.amqp.support.converter.ClassMapper;  
  12. import org.springframework.amqp.support.converter.DefaultClassMapper;  
  13. import org.springframework.amqp.support.converter.MessageConversionException;  
  14.   
  15. import com.google.gson.Gson;  
  16.   
  17. public class Gson2JsonMessageConverter extends AbstractJsonMessageConverter {  
  18.       
  19.     private static Log log = LogFactory.getLog(Gson2JsonMessageConverter.class);  
  20.       
  21.     private static  ClassMapper classMapper =  new DefaultClassMapper();  
  22.   
  23.     private static Gson gson = new Gson();  
  24.   
  25.     public Gson2JsonMessageConverter() {  
  26.         super();  
  27.     }  
  28.   
  29.     @Override  
  30.     protected Message createMessage(Object object,  
  31.             MessageProperties messageProperties) {  
  32.         byte[] bytes = null;  
  33.         try {  
  34.             String jsonString = gson.toJson(object);  
  35.             bytes = jsonString.getBytes(getDefaultCharset());  
  36.         }  
  37.         catch (IOException e) {  
  38.             throw new MessageConversionException(  
  39.                     "Failed to convert Message content", e);  
  40.         }  
  41.         messageProperties.setContentType(MessageProperties.CONTENT_TYPE_JSON);  
  42.         messageProperties.setContentEncoding(getDefaultCharset());  
  43.         if (bytes != null) {  
  44.             messageProperties.setContentLength(bytes.length);  
  45.         }  
  46.         classMapper.fromClass(object.getClass(),messageProperties);  
  47.         return new Message(bytes, messageProperties);  
  48.     }  
  49.   
  50.     @Override  
  51.     public Object fromMessage(Message message)  
  52.             throws MessageConversionException {  
  53.         Object content = null;  
  54.         MessageProperties properties = message.getMessageProperties();  
  55.         if (properties != null) {  
  56.             String contentType = properties.getContentType();  
  57.             if (contentType != null && contentType.contains("json")) {  
  58.                 String encoding = properties.getContentEncoding();  
  59.                 if (encoding == null) {  
  60.                     encoding = getDefaultCharset();  
  61.                 }  
  62.                 try {  
  63.                         Class<?> targetClass = getClassMapper().toClass(  
  64.                                 message.getMessageProperties());  
  65.                         content = convertBytesToObject(message.getBody(),  
  66.                                 encoding, targetClass);  
  67.                 }  
  68.                 catch (IOException e) {  
  69.                     throw new MessageConversionException(  
  70.                             "Failed to convert Message content", e);  
  71.                 }  
  72.             }  
  73.             else {  
  74.                 log.warn("Could not convert incoming message with content-type ["  
  75.                         + contentType + "]");  
  76.             }  
  77.         }  
  78.         if (content == null) {  
  79.             content = message.getBody();  
  80.         }  
  81.         return content;  
  82.     }  
  83.   
  84.     private Object convertBytesToObject(byte[] body, String encoding,  
  85.             Class<?> clazz) throws UnsupportedEncodingException {  
  86.         String contentAsString = new String(body, encoding);  
  87.         return gson.fromJson(contentAsString, clazz);  
  88.     }  
  89. }  
0 0
原创粉丝点击