【Spring】使用Spring和AMQP發送接收消息(下)


上篇講了使用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>

上面的<listener-container>與<listener>元素都來自rabbit命名空間。並通過queue-names屬性來指定要監聽的隊列,這里只設定了一個要監聽的隊列,如果要設置多個隊列的話,用逗號隔開。到這里消息接收就完成了,拿到消息后就可以在相應方法里執行相應處理了。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM