领先一步
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 的用户。尽管如此,点对点消息传递工作正常,如果您能够通过其他方法创建交换机,您就可以灵活地将消息发送到您选择的任何路由键。那么为什么不试试呢?