领先一步
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,则可以灵活地使用您选择的任何路由键向它们发送消息。所以为什么不试试看呢?