首頁 >Java >java教程 >java中使用Spring和AMQP發送接收訊息(下)

java中使用Spring和AMQP發送接收訊息(下)

怪我咯
怪我咯原創
2017-06-25 10:02:272138瀏覽

上篇講了使用RabbitMQ發送訊息,本篇則來講接收訊息。
在傳統JMS中有兩種從佇列取得資訊的方式,使用JmsTemplate的同步方式以及使用訊息驅動pojo的非同步方式。 Spring AMQP也提供了類似的方式來獲取透過AMQP發送的訊息。

使用RabbitTemplate來接收訊息

RabbitTemplate提供的接收資訊的方法中最簡單的就是receive()方法,透過該方法就可以從佇列中取得一個Message物件:

Message message = rabbit.receive("spittle.test.queue");

或也可以透過設定來取得訊息的預設佇列,這是透過在設定範本的時候,設定queue屬性實現的:

<template id="rabbitTemplate" 
    connection-factory="connectionFactory"exchange="spittle.test.exchange" 
    routing-key="spittle.test" 
    queue="spittle.test.queue" />

這樣的話,在呼叫receive()方法時,不需要設定任何參數就能從預設佇列中取得訊息:

Message message = rabbit.receive( );

#取得Message物件後,一般需要將它的body屬性中的位元組數組轉換為想要的對象,就像在發送的時候將領域對象轉換為Message一樣,將接收到的Message轉換為領域對像也很繁瑣。這裡可以考慮使用RabbitTemplate的receiveAndConvert()方法作為替代方案:

Spittle spittle = (Spittle) rabbit.receiveAndConvert("spittle.test.queue");

receiveAndConvert()方法會使用與sendAndConvert()方法相同的訊息轉換器,將Message物件轉換為原始的類型。
呼叫receive()和receiveAndConvert()方法都會立即傳回,如果佇列中沒有等待的訊息,將會得到null。這時一般需要程式設計師自己管理輪詢以及必要的線程,實現隊列監控。如果不想每次都同步輪詢等待訊息到達,可以使用Spring AMQP提供的訊息驅動pojo,下面就看看使用訊息驅動pojo的方式來接收訊息。

 

使用訊息驅動pojo來接收訊息

如果想要在訊息驅動pojo中非同步地消費使用Spittle對象,先解決這個pojo本身,如下的SpittleTestHandler扮演了這個角色:

public class SpittleTestHandler {public void handleSpittleTest (Spittle spittle) {
        ...
    }
}

其實這個類別並沒有依賴AMQP,不管透過什麼機制傳遞過來Spittle對象,它都能夠處理。
這裡還需要在Spring應用上下文中將SpittleTestHandler聲明為一個bean:

<bean id="spittleListener"class="com.***.spittr.test.SpittleTestHandler">

最後要聲明一個監聽器容器和監聽器,當訊息到達的時候,能夠調用SpittleTestHandler,配置如下:

<listener-container connection-factory="connectionFactory"><listener ref="spittleListener" 
          method="handleSpittleTest"  queue-names="spittle.test.queue" /></listener-container>

上面的元素都來自rabbit命名空間。並透過queue-names屬性來指定要監聽的佇列,這裡只設定了一個要監聽的佇列,如果要設定多個佇列的話,用逗號隔開。到這裡訊息接收就完成了,拿到訊息後就可以在對應方法裡執行對應處理了。

 

以上是java中使用Spring和AMQP發送接收訊息(下)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn