1. 程式人生 > >spring 非同步接收RabbitMQ訊息(spring-rabbit)

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來丟棄訊息。

參考: