spring 非同步接收RabbitMQ訊息(spring-rabbit)
在Spring框架中使用JMS傳遞訊息有兩種方式:JMS template和message listener container,前者用於同步收發訊息,後者用於非同步收發訊息。
本文主要講述用message listener container非同步收發訊息。
Spring中有三種方式配置非同步訊息監聽器:實現javax.jms.MessageListener介面、實現Spring的SessionAwareMessageListener和捆綁一個標準POJO到Spring的MessageListenerAdapter類上。這三種方法在訊息監聽器類結構上不同,但都要用message listener container,message listener container類似JmsTemplate。這三種監聽器的使用,在網上有很多資料,咱們下邊就說一下另外一種使用方式,不需要實現任何介面的。
spring-rabbit
Maven依賴
<dependency>
<groupId>org.springframework.amqp</groupId>
<artifactId>spring-rabbit</artifactId>
<version>1.6.1.RELEASE</version></dependency>
Java方式實現
spring-rabbit主要API有:
· MessageListenerContainer:監聽容器,為訊息入隊提供非同步處理
· RabbitTemplate :用來發送和接收訊息
· RabbitAdmin :宣告佇列、交換器(Exchange)、繫結(Binding)
一般不會使用此方式,就不詳細說明了
Spring方式實現
XML配置
<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.xsd http://www.springframework.org/schema/rabbit http://www.springframework.org/schema/rabbit/spring-rabbit.xsd"> <!--配置連線--> <rabbit:connection-factory id="connectionFactory" host="${rabbitmq.host}" username="${rabbitmq.username}" password="${rabbitmq.password}" port="${rabbitmq.port}" requested-heartbeat="20" /> <!--訊息轉換器--> <bean id="messageConverter" class="com.rabitMq.MessageConverter"/> <!--配置RabbitTemplate--> <rabbit:template id="amqpTemplate" message-converter="channelMessageConverter" connection-factory="connectionFactory"/> <!--配置RabbitAdmin--> <rabbit:admin connection-factory="connectionFactory"/> <!--配置佇列名--> <rabbit:queue name="rabitMq.mq.rabitMqConsumer" /> <!--自定義監聽--> <bean id="rabitMqConsumer" class="com.rabitMq.mq.RabitMqConsumer" /> <!--配置監聽--> <rabbit:listener-container message-converter="messageConverter" connection-factory="connectionFactory"> <rabbit:listener queues="com.rabitMq.mq.RabitMqConsumer" ref="rabitMqConsumer" method="run"/> </rabbit:listener-container> </beans>
監聽處理程式
/** * */package com.rabitMq.mq;public class RabitMqConsumer {public void run(String message) {//如果監聽程式處理異常了,要進行捕獲,否則會出現一直消費的情況,try { System.out.println(" [x] Received '" + message + "'");} catch (Exception e) { } }}
注意:
RabbitMQ訊息監聽程式異常時,消費者會向rabbitmq server傳送Basic.Reject,表示訊息拒絕接受,由於Spring預設requeue-rejected配置為true,訊息會重新入隊,然後rabbitmq server重新投遞,造成了程式一直異常的情況。所以說了這麼多,我們通過rabbitmq監聽訊息的時候,程式一定要新增try…catch語句!!!當然你也可以根據實際情況,選擇設定requeue-rejected為false來丟棄訊息。
參考: