RabbitMQ Grails 外掛 - 早期訪問

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

RabbitMQ 是一個基於高階訊息佇列協議 (AMQP) 的輕量級、可靠、可擴充套件且可移植的訊息代理。它非常適合異構系統和雲平臺,但它可以滿足幾乎任何大小的訊息傳遞需求。您(通常)不透過 JMS API 訪問它,事實上 JMS 外掛將無濟於事,但現在有一個新外掛可用,旨在讓從 Grails 應用程式中使用 RabbitMQ 變得容易。

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

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

更新 截圖影片中示例專案使用的原始碼

安裝訊息佇列代理

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

我使用一個 Ubuntu 虛擬機器來執行訊息佇列代理,因為安裝非常簡單

    sudo apt-get install rabbitmq-server

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

    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 應用程式中使用它了。

接收訊息

與訊息佇列代理互動的第一步是安裝外掛

    grails install-plugin rabbitmq 0.2

完成之後,您會看到一條訊息,說明您必須在...中新增一些設定grails-app/conf/Config.groovy才能使用它。具體來說,您需要配置訊息佇列代理的連線工廠,即訊息佇列代理的執行位置以及連線時要使用的憑據。因此,請開啟Config.groovy用您的編輯器,並新增以下內容

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

    queues = {
        msgs()
    }
}

這會將外掛配置為使用執行在本地機器上的預設 RabbitMQ 伺服器。如果訊息佇列代理未在本地執行,或者它執行在虛擬機器中,您將需要更改主機名。並且,不言而喻,請務必為生產環境中的訊息佇列代理使用更安全的憑據!

上面的程式碼還配置了一個名為 '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' 佇列。希望您很快就能在 Grails 應用程式的輸出中看到

Received message: Hello world

。就是這麼簡單——輕鬆便捷。

訊息型別

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

這對您意味著什麼?如果您同時使用外掛或 Spring AMQP 進行釋出和訂閱,您就不需要擔心轉換問題。如果您將一個 Map 作為訊息釋出,消費者會將其視為一個 Map。但如果您使用原始的 RabbitMQ Java 客戶端或不同的語言/平臺,您要麼需要確保釋出者設定了內容型別頭,要麼在消費者中自己執行資料轉換。

完成了這個小插曲,讓我們來看看如何傳送訊息。

傳送訊息

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

package org.example

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

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

    rabbitSend(String exchange, String routingKey, msg)

這將把訊息傳送到指定的交換機,並帶有給定的路由鍵。儘管該外掛還不能自己建立交換機,但它可以與現有交換機進行互動,這使得該方法的這種形式比乍一看更有用。有關交換機和路由鍵的更多資訊,請參閱我的AMQP 部落格文章

警告 您可能會遇到rabbitSend(msg),即只接受訊息的方法版本,但它沒有實際作用——除非您覆蓋了rabbitTemplatebean,這是一項超出了本文範圍的任務。

正如我之前提到的,該外掛的當前版本實際上是作為搶先體驗預覽版提供的,適用於那些在此階段不需要全功能支援但又想開始使用 RabbitMQ 的使用者。儘管如此,點對點訊息傳遞工作正常,如果您能夠透過其他方法建立交換機,您就可以靈活地將訊息傳送到您選擇的任何路由鍵。那麼為什麼不試試呢?

獲取 Spring 新聞通訊

透過 Spring 新聞通訊保持聯絡

訂閱

領先一步

VMware 提供培訓和認證,助您加速進步。

瞭解更多

獲得支援

Tanzu Spring 提供 OpenJDK™、Spring 和 Apache Tomcat® 的支援和二進位制檔案,只需一份簡單的訂閱。

瞭解更多

即將舉行的活動

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

檢視所有