Grails 的 RabbitMQ 外掛 - 早期訪問

工程 | Peter Ledbrook | 2010 年 8 月 23 日 | ...

RabbitMQ 是一個輕量級、可靠、可伸縮且可移植的訊息代理,基於 高階訊息佇列協議 (AMQP)。它非常適合異構系統和雲平臺,但幾乎可以用於任何訊息傳遞需求,無論大小。您(通常)不會透過 JMS API 訪問它,事實上 JMS 外掛也無濟於事,但現在有一個新外掛專門用於簡化 Grails 應用程式中使用 RabbitMQ 的過程。

該外掛的當前版本 (0.2) 功能相對有限,但您已經可以傳送和接收訊息。我鼓勵您試用並提供反饋——您有機會影響它的發展!

更新 隨附的截圖影片現已釋出

更新 截圖影片中建立的示例專案的原始碼

安裝 Broker

在使用該外掛之前,您需要先搭建一個 RabbitMQ 伺服器。請檢視 RabbitMQ 伺服器下載頁面,找到適合您平臺的安裝包。然後按照相應的安裝說明進行操作。

我使用一臺 Ubuntu 虛擬機器來執行 broker,因為安裝只需要一行命令

    sudo apt-get install rabbitmq-server

此命令不僅會安裝伺服器,還會將其配置為開機自啟動。要檢查 broker 是否正在執行,您可以執行以下命令

    sudo rabbitmqctl status

這應該會顯示如下所示的輸出

    Status of node rabbit@ubuntu ...
    [{running_applications,[{rabbit,"RabbitMQ","1.7.2"},
                            {mnesia,"MNESIA  CXC 138 12","4.4.12"},
                            {os_mon,"CPO  CXC 138 46","2.2.4"},
                            {sasl,"SASL  CXC 138 11","2.1.8"},
                            {stdlib,"ERTS  CXC 138 10","1.16.4"},
                            {kernel,"ERTS  CXC 138 10","2.13.4"}]},
     {nodes,[rabbit@ubuntu]},
     {running_nodes,[rabbit@ubuntu]}]
    ...done.

假設它已成功安裝並正在執行,您就可以開始在 Grails 應用程式中使用它了。

接收訊息

與 broker 互動的第一步是安裝外掛

    grails install-plugin rabbitmq 0.2

完成後,您會看到一條訊息,解釋您需要在以下檔案中新增一些設定grails-app/conf/Config.groovy然後才能使用它。具體來說,您需要配置 broker 的連線工廠,即 broker 正在執行的位置以及連線時使用的憑據。所以,開啟Config.groovy在您的編輯器中,並新增以下內容

rabbitmq {
    connectionfactory {
        username = 'guest'
        password = 'guest'
        hostname = 'localhost'
        consumers = 5
    }

    queues = {
        msgs()
    }
}

這將配置外掛使用執行在本地機器上的預設 RabbitMQ 伺服器。如果 broker 未在本地執行或正在虛擬機器中執行,則需要更改主機名。並且冒著陳述顯而易見的風險,請確保為生產環境中的 broker 例項使用更安全的憑據!

上面的程式碼還配置了一個名為 'msgs' 的佇列。重要的是要理解,此設定確保在應用程式啟動時佇列已存在,即如果佇列不存在,外掛將建立它。如果由其他應用程式建立了佇列,那麼您就無需在以下檔案中配置該隊列了Config.groovy。有關外掛配置的更多資訊,請查閱外掛的使用者指南

現在我們已經設定了一個佇列,如何處理來自它的訊息呢?很簡單:建立一個服務!這裡有一個示例(檔案位置grails-app/services/org/example/ConsumerService.groovy):

package org.example

class ConsumerService {
    static rabbitQueue = "msgs"

    void handleMessage(msg) {
        println "Received message: $msg"
    }
}

靜態rabbitQueue屬性告訴外掛此服務應監聽哪個佇列。在本例中,它是在以下檔案中配置的佇列Config.groovy。該handleMessage()方法將在佇列上有訊息可用時被呼叫,並且訊息的內容將作為引數傳遞。

現在我們可以開始了;我們所要做的就是向該佇列釋出一些訊息。我為此借用了一個Groovy 指令碼,並已將其提供。它當前硬編碼為 'localhost',但如果需要,您可以輕鬆更改它。假設 Grails 應用程式正在執行並且您已安裝 Groovy 並將其新增到路徑中,您可以像這樣呼叫指令碼

    groovy publisher.groovy msgs "Hello world"

這將把訊息內容 "Hello world" 傳送到 'msgs' 佇列。希望您很快會在

Received message: Hello world

Grails 應用程式的輸出中看到。就是這麼簡單——輕鬆又愉快。

關於訊息型別

在我向您展示如何從 Grails 應用程式傳送訊息之前,請注意一點:AMQP 訊息的內容基本上是一個位元組序列。通常情況下,由消費者負責將該位元組序列(在 Java 中是一個位元組陣列)轉換為其適當的形式,但如果訊息具有適當的內容型別頭,Grails 外掛將自動執行轉換。事實上,這種自動轉換是由 Spring AMQP 庫處理的,該外掛在底層使用了它。

這對您意味著什麼?好吧,如果您將此外掛或 Spring AMQP 用於消費者和釋出者,則無需擔心轉換問題。如果您釋出一個 map 作為訊息,消費者將看到它是一個 map。但如果您使用原生的 RabbitMQ Java 客戶端或不同的語言/平臺,則必須確保由釋出者設定內容型別頭,或由消費者自行執行資料轉換。

在稍微跑題之後,讓我們看看如何傳送訊息。

傳送訊息

透過 RabbitMQ 傳送訊息比接收訊息更容易。該外掛動態添加了一個名為rabbitSend()的方法到所有 artifact 中,包括控制器和服務。例如,我們可以在服務中這樣使用它

package org.example

class PublishService {
    void sendMessage(String msg) {
        rabbitSend 'msgs', msg
    }
}

這個服務只是向 'msgs' 佇列傳送一些文字訊息。如果您想要更多的靈活性,可以使用以下方法的另一種形式rabbitSend()方法

    rabbitSend(String exchange, String routingKey, msg)

這將把訊息傳送到指定的 exchange,並使用給定的路由鍵。雖然該外掛尚不能建立 exchange,但它可以與現有的 exchange 互動,這使得該方法的這種形式比初看起來更有用。有關 exchange 和路由鍵的更多資訊,請參閱我的AMQP 部落格文章

警告 您可能會偶然發現rabbitSend(msg),即僅接受一個訊息引數的方法版本,但它並沒有什麼實際用途——除非您覆蓋rabbitTemplatebean,這是一項超出本文範圍的任務。

正如我之前提到的,該外掛的當前版本實際上是作為早期訪問預覽版提供的,適用於那些目前不需要全功能支援但希望開始使用 RabbitMQ 的使用者。儘管如此,點對點訊息傳遞工作正常,如果您能夠透過其他方法建立 exchange,則可以靈活地使用您選擇的任何路由鍵向它們傳送訊息。所以為什麼不試試看呢?

訂閱 Spring 新聞通訊

透過 Spring 新聞通訊保持聯絡

訂閱

領先一步

VMware 提供培訓和認證,助力您的飛速進步。

瞭解更多

獲取支援

Tanzu Spring 透過一項簡單的訂閱,提供對 OpenJDK™、Spring 和 Apache Tomcat® 的支援和二進位制檔案。

瞭解更多

即將舉行的活動

檢視 Spring 社群的所有即將舉行的活動。

檢視全部