领先一步
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,则无需担心转换。如果您发布一个映射作为消息,使用者将看到它是一个映射。但是,如果您使用原始 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 的用户。也就是说,点对点消息传递工作正常,如果您能够通过其他方法创建交换机,则您可以灵活地将消息发送到它们,并使用您选择的任何路由键。所以为什么不试一试呢?