返回介绍

17.3.2 配置 Spring 支持 AMQP 消息

发布于 2024-08-17 00:45:49 字数 3740 浏览 0 评论 0 收藏 0

当我们第一次使用Spring JMS抽象的时候,首先配置了一个连接工厂。与之类似,使用Spring AMQP前也要配置一个连接工厂。只不过,所要配置的不是JMS的连接工厂,而是需要配置AMQP的连接工厂。更具体来讲,需要配置RabbitMQ连接工厂。

什么是RabbitMQ

RabbitMQ是一个流行的开源消息代理,它实现了AMQP。Spring AMQP为RabbitMQ提供了支持,包括RabbitMQ连接工厂、模板以及Spring配置命名空间。

在使用它发送和接收消息之前,你需要预先安装RabbitMQ。我们可以在www.rabbitmq.com/download.html上找到安装指南。根据你所运行的OS不同,这会有所差别,所以根据环境的不同,遵循相应指南进行安装的任务就留给读者自己完成。

配置RabbitMQ连接工厂最简单的方式就是使用Spring AMQP所提供的rabbit配置命名空间。为了使用这项功能,需要确保在Spring配置文件中已经声明了该模式:

尽管不是必须的,但我还选择在这个配置中将rabbit作为首选的命名空间,将beans作为第二位的命名空间。这是因为在这个配置中,我会更多的声明rabbit而不是bean,这样的话,只会有少量的bean元素使用“beans:”前缀,而rabbit元素就能够避免使用前缀了。

rabbit命名空间包含了多个在Spring中配置RabbitMQ的元素。但此时,你最感兴趣的可能就是<connection-factory>。按照其最简单的形式,我们可以在配置RabbitMQ连接工厂的时候没有任何属性:

这的确能够运行起来,但是所导致的结果就是连接工厂bean没有可用的bean ID,这样的话就难将连接工厂装配到需要它的bean中。因此,我们可能希望通过id属性为其设置一个bean ID:

默认情况下,连接工厂会假设RabbitMQ服务器监听localhost的5672端口,并且用户名和密码均为guest。对于开发来讲,这是合理的默认值,但是对于生产环境,我们可能希望修改这些默认值。如下<connection-factory>的设置重写了默认的做法:

我们使用占位符来指定值,这样配置项可以在Spring配置文件之外进行管理(很可能位于属性文件中)。

除了连接工厂以外,我们还要考虑使用其他的几个配置元素。接下来,看一下如何创建队列、Exchange以及binding。

声明队列、Exchange以及binding

在JMS中,队列和主题的路由行为都是通过规范建立的,AMQP与之不同,它的路由更加丰富和灵活,依赖于如何定义队列和Exchange以及如何将它们绑定在一起。声明队列、Exchange和binding的一种方式是使用RabbitMQ Channel接口的各种方法。但是直接使用RabbitMQ的Channel接口非常麻烦。Spring AMQP能否帮助我们声明消息路由组件呢?

幸好,rabbit命名空间包含了多个元素,帮助我们声明队列、Exchange以及将它们结合在一起的binding。表17.3中列出了这些元素。

表17.3 Spring AMQP的rabbit命名空间包含了多个元素,用来创建队列、Exchange以及将它们结合在一起的binding

元  素

作  用

<queue>

创建一个队列

<fanout-exchange>

创建一个fanout类型的Exchange

<header-exchange>

创建一个header类型的Exchange

<topic-exchange>

创建一个topic类型的Exchange

<direct-exchange>

创建一个direct类型的Exchange

<bindings><binding/></bindings>

元素定义一个或多个元素的集合。元素创建Exchange和队列之间的binding

这些配置元素要与<admin>元素一起使用。<admin>元素会创建一个RabbitMQ管理组件(administrative component),它会自动创建(如果它们在RabbitMQ代理中尚未存在的话)上述这些元素所声明的队列、Exchange以及binding。

例如,如果你希望声明名为spittle.alert.queue的队列,只需要在Spring配置中添加如下的两个元素即可:

对于简单的消息来说,我们只需做这些就足够了。这是因为默认会有一个没有名称的direct Exchange,所有的队列都会绑定到这个Exchange上,并且routing key与队列的名称相同。在这个简单的配置中,我们可以将消息发送到这个没有名称的Exchange上,并将routing key设定为spittle.alert.queue,这样消息就会路由到这个队列中。实际上,我们重新创建了JMS的点对点模型。

但是,更加有意思的路由需要我们声明一个或更多的Exchange,并将其绑定到队列上。例如,如果要将消息路由到多个队列中,而不管routing key是什么,我们可以按照如下的方式配置一个fanout以及多个队列:

借助表17.3中的元素,会有无数种在RabbitMQ配置路由的方式,但是我却没有无尽的篇幅来为读者描述它们,所以为了让我们的讨论不至于偏离方向,我将这些创造性的路由作为练习留给读者,我将会继续讨论如何发送消息。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文