領先一步
VMware 提供培訓和認證,助力您的飛速進步。
瞭解更多RabbitMQ 是一個輕量級、可靠、可伸縮且可移植的訊息代理,基於 高階訊息佇列協議 (AMQP)。它非常適合異構系統和雲平臺,但幾乎可以用於任何訊息傳遞需求,無論大小。您(通常)不會透過 JMS API 訪問它,事實上 JMS 外掛也無濟於事,但現在有一個新外掛專門用於簡化 Grails 應用程式中使用 RabbitMQ 的過程。
該外掛的當前版本 (0.2) 功能相對有限,但您已經可以傳送和接收訊息。我鼓勵您試用並提供反饋——您有機會影響它的發展!
更新 隨附的截圖影片現已釋出
更新 截圖影片中建立的示例專案的原始碼。
在使用該外掛之前,您需要先搭建一個 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 應用程式的輸出中看到。就是這麼簡單——輕鬆又愉快。
這對您意味著什麼?好吧,如果您將此外掛或 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,則可以靈活地使用您選擇的任何路由鍵向它們傳送訊息。所以為什麼不試試看呢?