- 作者简介
- 内容提要
- 关于本书
- 路线图
- 代码规范与下载
- 作者在线
- 封面插图简介
- 前言
- 译者序
- 致谢
- 第1部分 Spring 的核心
- 第1章 Spring 之旅
- 第2章 装配 Bean
- 第3章 高级装配
- 第4章 面向切面的 Spring
- 第2部分 Web 中的 Spring
- 第5章 构建 Spring Web 应用程序
- 第6章 渲染 Web 视图
- 第7章 Spring MVC 的高级技术
- 第8章 使用 Spring Web Flow
- 第9章 保护 Web 应用
- 第3部分 后端中的 Spring
- 第10章 通过 Spring 和 JDBC 征服数据库
- 第11章 使用对象-关系映射持久化数据
- 第12章 使用 NoSQL 数据库
- 第13章 缓存数据
- 第14章 保护方法应用
- 第4部分 Spring 集成
- 第15章 使用远程服务
- 第16章 使用 Spring MVC 创建 REST API
- 第17章 Spring消息
- 第18章 使用 WebSocket 和 STOMP 实现消息功能
- 第19章 使用 Spring 发送 Email
- 第20章 使用 JMX 管理 Spring Bean
- 第21章 借助 Spring Boot 简化 Spring 开发
17.3.2 配置 Spring 支持 AMQP 消息
当我们第一次使用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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论