1.添加 maven 項目依賴html
<dependency> <groupId>org.springframework.amqp</groupId> <artifactId>spring-rabbit</artifactId> <version>1.3.5.RELEASE</version> </dependency>
2.添加 spring-rabbitmq.xml 配置java
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:rabbit="http://www.springframework.org/schema/rabbit" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/rabbit http://www.springframework.org/schema/rabbit/spring-rabbit-1.0.xsd"> <!-- 鏈接服務配置,若是MQ服務器在遠程服務器上,請新建用戶用新建的用戶名密碼,guest默認不容許遠程登陸 --> <rabbit:connection-factory id="connectionFactory" host="host" username="user" password="pwd" port="port" virtual-host="/" channel-cache-size="5"/> <!-- 配置admin,自動根據配置文件生成交換器和隊列,無需手動配置 --> <rabbit:admin connection-factory="connectionFactory"/> <!-- queue 隊列聲明 --> <rabbit:queue durable="true" auto-delete="false" exclusive="false" name="rabbit.queue.test1"/> <rabbit:queue durable="true" auto-delete="false" exclusive="false" name="rabbit.queue.test2"/> <!-- exchange queue binging key 綁定 --> <rabbit:direct-exchange name="rabbit.queue.exchange" durable="true" auto-delete="false"> <rabbit:bindings> <rabbit:binding queue="rabbit.queue.test1" key="rabbit.queue.test1.key"/> <rabbit:binding queue="rabbit.queue.test2" key="rabbit.queue.test2.key"/> </rabbit:bindings> </rabbit:direct-exchange> <!-- spring amqp默認的是jackson的一個插件,目的將生產者生產的數據轉換爲json存入消息隊列,因爲Gson的速度快於jackson,這裏替換爲Gson的一個實現 --> <bean id="jsonMessageConverter" class="top.tarencez.ssmdemo.config.Gson2JsonMessageConverter"/> <!-- spring template聲明 --> <rabbit:template id="amqpTemplate" exchange="rabbit.queue.exchange" routing-key="spring.queue.tag.key" connection-factory="connectionFactory" message-converter="jsonMessageConverter"/> <bean id="receiveMessageListener" class="top.tarencez.ssmdemo.common.component.MQListenter" /> <!-- queue litener 觀察監聽模式,當有消息到達時會通知監聽在對應的隊列上的監聽對象 --> <rabbit:listener-container connection-factory="connectionFactory" acknowledge="auto" > <rabbit:listener queues="rabbit.queue.test1" ref="receiveMessageListener" /> <!--<rabbit:listener queues="rabbit.queue.test2" ref="receiveMessageListener" />--> </rabbit:listener-container> </beans>
3.在 applicationContext.xml 文件中引入 spring-rabbitmq.xmlweb
<import resource="classpath:conf/spring-rabbitmq.xml"/>
4.Gson配置spring
package top.tarencez.ssmdemo.config; 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); } }
5.生產者接口及接口調用apache
package top.tarencez.ssmdemo.common.component; import org.springframework.amqp.core.AmqpTemplate; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @Component public class MQProducer { @Autowired private AmqpTemplate amqpTemplate; public void sendMessage(String queueKey, Object message) { System.out.println("===== " + amqpTemplate); try { amqpTemplate.convertAndSend(queueKey, message); System.out.println("===== 消息發送成功 ====="); } catch (Exception e) { System.out.println(e); } } }
package top.tarencez.ssmdemo.rabbitmq.controller; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import top.tarencez.ssmdemo.common.component.MQProducer; import top.tarencez.ssmdemo.shiro.vo.TestVO; @Controller @RequestMapping("/mq") public class MQController { @Autowired private MQProducer mqProducer; @RequestMapping("/test") public void test() { System.out.println("===== test mq send ====="); TestVO testVO = new TestVO(); testVO.setId(1); testVO.setName1("aaa"); testVO.setName2("bbb"); mqProducer.sendMessage("rabbit.queue.test1.key", testVO); } }
6.消費者接口json
package top.tarencez.ssmdemo.common.component; import org.springframework.amqp.core.Message; import org.springframework.amqp.core.MessageListener; import org.springframework.stereotype.Component; import java.io.UnsupportedEncodingException; @Component public class MQListenter implements MessageListener { @Override public void onMessage(Message msg) { try { System.out.print("===== 接受到消息:" + new String(msg.getBody(), "UTF-8")); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } } }
7.測試驗證服務器
1.添加 maven 項目依賴app
<dependency> <groupId>org.springframework.amqp</groupId> <artifactId>spring-rabbit</artifactId> <version>1.3.5.RELEASE</version> </dependency>
2.添加 spring-rabbitmq.xml 配置maven
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:rabbit="http://www.springframework.org/schema/rabbit" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/rabbit http://www.springframework.org/schema/rabbit/spring-rabbit-1.0.xsd"> <!-- 鏈接服務配置,若是MQ服務器在遠程服務器上,請新建用戶用新建的用戶名密碼,guest默認不容許遠程登陸 --> <rabbit:connection-factory id="connectionFactory" host="host" username="user" password="pwd" port="port" virtual-host="/" channel-cache-size="5"/> <!-- 配置admin,自動根據配置文件生成交換器和隊列,無需手動配置 --> <rabbit:admin connection-factory="connectionFactory"/> <!-- queue 隊列聲明 --> <rabbit:queue durable="true" auto-delete="false" exclusive="false" name="rabbit.queue.test1"/> <rabbit:queue durable="true" auto-delete="false" exclusive="false" name="rabbit.queue.test2"/> <!-- exchange queue binging key 綁定 --> <rabbit:direct-exchange name="rabbit.queue.exchange" durable="true" auto-delete="false"> <rabbit:bindings> <rabbit:binding queue="rabbit.queue.test1" key="rabbit.queue.test1.key"/> <rabbit:binding queue="rabbit.queue.test2" key="rabbit.queue.test2.key"/> </rabbit:bindings> </rabbit:direct-exchange> <!-- spring amqp默認的是jackson的一個插件,目的將生產者生產的數據轉換爲json存入消息隊列,因爲Gson的速度快於jackson,這裏替換爲Gson的一個實現 --> <bean id="jsonMessageConverter" class="top.tarencez.ssmdemo.config.Gson2JsonMessageConverter"/> <!-- spring template聲明 --> <rabbit:template id="amqpTemplate" exchange="rabbit.queue.exchange" routing-key="spring.queue.tag.key" connection-factory="connectionFactory" message-converter="jsonMessageConverter"/> <bean id="receiveMessageListener" class="top.tarencez.ssmdemo.common.component.MQListenter" /> <!-- queue litener 觀察監聽模式,當有消息到達時會通知監聽在對應的隊列上的監聽對象 --> <rabbit:listener-container connection-factory="connectionFactory" acknowledge="auto" > <rabbit:listener queues="rabbit.queue.test1" ref="receiveMessageListener" /> <!--<rabbit:listener queues="rabbit.queue.test2" ref="receiveMessageListener" />--> </rabbit:listener-container> </beans>
3.在 applicationContext.xml 文件中引入 spring-rabbitmq.xmlide
<import resource="classpath:conf/spring-rabbitmq.xml"/>
4.Gson配置
package top.tarencez.ssmdemo.config;
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); } }
5.生產者接口及接口調用
package top.tarencez.ssmdemo.common.component;
import org.springframework.amqp.core.AmqpTemplate; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @Component public class MQProducer { @Autowired private AmqpTemplate amqpTemplate; public void sendMessage(String queueKey, Object message) { System.out.println("===== " + amqpTemplate); try { amqpTemplate.convertAndSend(queueKey, message); System.out.println("===== 消息發送成功 ====="); } catch (Exception e) { System.out.println(e); } } }
package top.tarencez.ssmdemo.rabbitmq.controller;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import top.tarencez.ssmdemo.common.component.MQProducer; import top.tarencez.ssmdemo.shiro.vo.TestVO; @Controller @RequestMapping("/mq") public class MQController { @Autowired private MQProducer mqProducer; @RequestMapping("/test") public void test() { System.out.println("===== test mq send ====="); TestVO testVO = new TestVO(); testVO.setId(1); testVO.setName1("aaa"); testVO.setName2("bbb"); mqProducer.sendMessage("rabbit.queue.test1.key", testVO); } }
6.消費者接口
package top.tarencez.ssmdemo.common.component;
import org.springframework.amqp.core.Message; import org.springframework.amqp.core.MessageListener; import org.springframework.stereotype.Component; import java.io.UnsupportedEncodingException; @Component public class MQListenter implements MessageListener { @Override public void onMessage(Message msg) { try { System.out.print("===== 接受到消息:" + new String(msg.getBody(), "UTF-8")); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } } }
7.測試驗證
參考文章:
http://www.javashuo.com/article/p-xohudine-dm.html