返回介绍

17.2.1 在 Spring 中搭建消息代理

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

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 技术交流群。

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

发布评论

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