Grails 的 RabbitMQ 插件 - 早期访问

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

RabbitMQ 是一个轻量级、可靠、可伸缩且可移植的消息代理,基于 高级消息队列协议 (AMQP)。它非常适合异构系统和云平台,但几乎可以用于任何消息传递需求,无论大小。您(通常)不会通过 JMS API 访问它,事实上 JMS 插件也无济于事,但现在有一个新插件专门用于简化 Grails 应用程序中使用 RabbitMQ 的过程。

该插件的当前版本 (0.2) 功能相对有限,但您已经可以发送和接收消息。我鼓励您试用并提供反馈——您有机会影响它的发展!

更新 随附的截屏视频现已发布

更新 截屏视频中创建的示例项目的源代码

安装 Broker

在使用该插件之前,您需要先搭建一个 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 应用程序的输出中看到。就是这么简单——轻松又愉快。

关于消息类型

在我向您展示如何从 Grails 应用程序发送消息之前,请注意一点:AMQP 消息的内容基本上是一个字节序列。通常情况下,由消费者负责将该字节序列(在 Java 中是一个字节数组)转换为其适当的形式,但如果消息具有适当的内容类型头,Grails 插件将自动执行转换。事实上,这种自动转换是由 Spring AMQP 库处理的,该插件在底层使用了它。

这对您意味着什么?好吧,如果您将此插件或 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,则可以灵活地使用您选择的任何路由键向它们发送消息。所以为什么不试试看呢?

订阅 Spring 新闻通讯

通过 Spring 新闻通讯保持联系

订阅

领先一步

VMware 提供培训和认证,助力您的飞速进步。

了解更多

获取支持

Tanzu Spring 通过一项简单的订阅,提供对 OpenJDK™、Spring 和 Apache Tomcat® 的支持和二进制文件。

了解更多

即将举行的活动

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

查看全部