領先一步
VMware 提供培訓和認證,助您加速進步。
瞭解更多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
。就是這麼簡單——輕鬆便捷。
這對您意味著什麼?如果您同時使用外掛或 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 的使用者。儘管如此,點對點訊息傳遞工作正常,如果您能夠透過其他方法建立交換機,您就可以靈活地將訊息傳送到您選擇的任何路由鍵。那麼為什麼不試試呢?