- 作者简介
- 内容提要
- 关于本书
- 路线图
- 代码规范与下载
- 作者在线
- 封面插图简介
- 前言
- 译者序
- 致谢
- 第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.2.1 在 Spring 中搭建消息代理
ActiveMQ是一个伟大的开源消息代理产品,也是使用JMS进行异步消息传递的最佳选择。在我编写本书的时候,ActiveMQ的最新版本为5.9.1。在开始使用ActiveMQ之前,我们需要从http://activemq.apache.org下载二进制发行包。下载完ActiveMQ后,我们将其解压缩到本地硬盘中。在解压目录中,我们会找到文件activemq-core-5.9.1.jar。为了能够使用ActiveMQ的API,我们需要将此JAR文件添加到应用程序的类路径中。
在bin目录下,我们可以看到为各种操作系统所创建的对应子目录。在这些子目录下,我们可以找到用于启动ActiveMQ的脚本。例如,要在OS X下启动ActiveMQ,我们只需要在“bin/macosx”目录下运行activemq start。运行脚本后,ActiveMQ就准备好了,这时可以使用它作为消息代理。
创建连接工厂
在本章中,我们将了解如何采用不同的方式在Spring中使用JMS发送和接收消息。在所有的示例中,我们都需要借助JMS连接工厂通过消息代理发送消息。因为选择了ActiveMQ作为我们的消息代理,所以我们必须配置JMS连接工厂,让它知道如何连接到ActiveMQ。ActiveMQConnectionFactory是ActiveMQ自带的连接工厂,在Spring中可以使用如下方式进行配置:
默认情况下,ActiveMQConnectionFactory会假设ActiveMQ代理监听localhost的61616端口。对于开发环境来说,这没有什么问题,但是在生产环境下,ActiveMQ可能会在不同的主机和/端口上。如果是这样的话,我们可以使用brokerURL属性来指定代理的URL:
配置连接工厂还有另外一种方式,既然我们知道正在与ActiveMQ打交道,那我们就可以使用ActiveMQ自己的Spring配置命名空间来声明连接工厂(适用于ActiveMQ 4.1之后的所有版本)。首先,我们必须确保在Spring的配置文件中声明了amq命名空间:
现在我们就可以使用<amq:connectionFactory>元素声明连接工厂:
注意,<amq:connectionFactory>元素很明显是为ActiveMQ所准备的。如果我们使用不同的消息代理实现,它们不一定会提供Spring配置命名空间。如果没有提供的话,那我们就需要使用<bean>来装配连接工厂。
在本章的后续内容中,我们会多次使用connectionFactorybean,但是现在,我们只需要通过配置brokerURL属性来告知连接工厂消息代理的位置就足够了。在本例中,brokerURL属性中的URL指定连接工厂要连接到本地机器的61616端口(这个端口是ActiveMQ监听的默认端口)上的ActiveMQ。
声明ActiveMQ消息目的地
除了连接工厂外,我们还需要消息传递的目的地。目的地可以是一个队列,也可以是一个主题,这取决于应用的需求。
不论使用的是队列还是主题,我们都必须使用特定的消息代理实现类在Spring中配置目的地bean。例如,下面的<bean>声明定义了一个ActiveMQ队列:
同样,下面的<bean>声明定义了一个ActiveMQ主题:
在第一个示例中,构造器指定了队列的名称,这样消息代理就能获知该信息,而在接下来示例中,名称则为spitter.topic。
与连接工厂相似的是,ActiveMQ命名空间提供了另一种方式来声明队列和主题。对于队列,我们可以使用<amq:quence>元素来声明:
如果是JMS主题,我们可以使用<amq:topic>元素来声明:
不管是哪种类型,都是借助physicalName属性指定消息通道的名称。
到此为止,我们已经看到了如何声明使用JMS所需的组件。现在我们已经准备好发送和接收消息了。为此,我们将使用Spring的JmsTemplate——Spring 对JMS支持的核心部分。但是首先,让我们先看看如果没有JmsTemplate,JMS是怎样使用的,以此了解JmsTemplate到底提供了些什么。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论