上篇講了使用RabbitMQ發送訊息,本篇則來講接收訊息。
在傳統JMS中有兩種從佇列取得資訊的方式,使用JmsTemplate的同步方式以及使用訊息驅動pojo的非同步方式。 Spring AMQP也提供了類似的方式來獲取透過AMQP發送的訊息。
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中非同步地消費使用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>
上面的
以上是java中使用Spring和AMQP發送接收訊息(下)的詳細內容。更多資訊請關注PHP中文網其他相關文章!