Grails RabbitMQ 插件 - 早期访问

工程 | Peter Ledbrook | 2010年8月23日 | ...

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

。这就是全部内容 - 简单而方便。

关于消息类型

在向您展示如何从 Grails 应用程序发送消息之前,需要注意的是:AMQP 消息的内容基本上是一系列字节。通常,这取决于使用者将该字节序列(Java 中的字节数组)转换为其正确的形式,但是如果消息具有适当的内容类型标头,则 Grails 插件将自动执行转换。实际上,此自动转换由插件使用的Spring AMQP 库处理。

这对您意味着什么?好吧,如果您对使用者和发布者都使用插件或 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 的用户。也就是说,点对点消息传递工作正常,如果您能够通过其他方法创建交换机,则您可以灵活地将消息发送到它们,并使用您选择的任何路由键。所以为什么不试一试呢?

获取 Spring 新闻通讯

通过 Spring 新闻通讯保持联系

订阅

领先一步

VMware 提供培训和认证,以加速您的进步。

了解更多

获取支持

Tanzu Spring 在一个简单的订阅中提供对 OpenJDK™、Spring 和 Apache Tomcat® 的支持和二进制文件。

了解更多

即将举行的活动

查看 Spring 社区中所有即将举行的活动。

查看全部