如本章前文所示,第一个用例以股票交易为例,阐述发布/订阅消息模型。这个简单的例子利用发布者类发送股票价格消息给一个主题,同时消费者类通过注册一个监听类使用异步方式从主题接收消息。这三个类实现了如下功能:通过订阅主题,消息消费者可获取发送到该主题的不断变化的股票价格。
本例中,股票价格被发布到任意数量的主题中。主题的数量取决于命令行中传递给消息发布者和消息消费者的主题数目参数。每个类都可以动态的发送消息到主题或者从主题接收消息(接下来将提供一个例子)。图3.2和图3.3 概述这两个例子是如何设计实现的。
本例中,我们使用了两个主题。消息发布者类使用单个JMS消息生产者发送1000个虚构的股票价格消息。 这些股票价格消息以10个为一组,随机分发到不同的主题,这些主题的名字是通过命令行参数传递进来的。 发送完1000个消息后,消息发布者被关闭。消息消费者类为每一个主题创建一个消息消费者(MessageConsumer), 并为每一个主题创建一个消息监听器(MessageListener)。因为本例是阐述消息发布/订阅的, 并且stock portfolio实例中没有使用持久的消息消费者,所以消息消费者必须联机在线,以便消费发布者发送的消息。 下一步我们将真正运行这个实例,你将看到这个实例中的类是如何工作的。
3.2.1 运行stock portfolio实例
可以通过以下三个基本步骤运行本实例:
启动ActiveMQ
运行Consumer类
运行Publisher类
这些步骤正如他们看起来的那样–简单。唯一需要注意的一点就是Consumer类需要在Publisher 类之前运行,以便接收所有已发布的消息。这是因为本实例阐述的是消息的发布/订阅,而主题不会持久化消息,除非消息消费者进行了持久化订阅。本例中消息消费者没有使用持久化订阅。 下面让我开始运行stock portfolio这个例子。
第一步需要打开一个终端或控制台窗口,然后启动ActiveMQ。这一步仅仅需要一个命令,如下所示: 。/bin/activemq console
下一步,打开第二个终端窗口或控制台窗口执行Consumer类。Consumer类使用Maven的maven-exec-plugin 插件,需要使用exec。args传递几个系统属性作为参数。下面是允许Consumer的命令例子: [amq-in-action-example-src] $ mvn exec:java -Dexec.mainClass=org.apache.activemq.book.ch3.portfolio.Consumer -Dexec.args=”CSCO ORCL”
在清单3。3中,你会看到Maven下载必要的依赖包以便运行这个例子。一旦消费者类运行完成, 即可启动Publisher类开始发布股票价格消息到以命令行传递的参数命名的主题,传递的参数为: CSCO 和 ORCL。这两个主题名称是随便选取的,你可以用其他任意字符串代替。重要的一点是 运行Consumer类 和 Publisher类都要使用的通过系统属性exec。args传递的变量 (运行Publisher的命令将在下文给出)。
注意,运行consumer类的命令后的输出看起来像是Consumer类挂起了。这是正常的,因为Consumer在 等待主题中的消息。一旦消息发布者发送消息,Consumer就将开始处理消息。
为什么前面命令输出中显示Maven依赖库都从本地(localhost)下载? 如果3。1节中Maven设置正确,Maven在运行示例代码时会下载所有的依赖包。在输出中也可看到Maven 下载依赖包的相关信息。注意到所有的依赖包都是从本地下载而不是从远程的maven依赖包仓库下载。 这是因为实例是使用Maven运行的,Maven使用了本机中一个名称为Nexus的依赖库管理器。使用Nexus 有很多好处,其中之一是:Nexus使用所有已下载的依赖库的本地缓存作为到远程Maven依赖库的代理。 在成功构建后,Nexus本地依赖库缓存取代检查远程代理库,这样很可观的加快了构建速度。 更多关于Nexus的信息,请访问:http://nexus。sonatype。org/。
因为之前运行Consumer类时,Maven已经下载了所有的依赖包,所以执行Publisher时就不需要再下载了。 下面的输出显示了以10个为一组发送到两个主题的股票价格消息。因为篇幅关系,这个例子的输出被截断了, 这里仅需要了解的是的Publisher会一直类运行到发送了1000个消息为止。 执行完Publisher类后,如果你回头看看第二个终端或命令行窗口,你会看到Consumer类启动了, 你应该会看到类型下面的Consumer类处理主题中消息的输出信息。
前面提到的输出来自Listener类,是Consumer类在主题名称为ORCL和CSCO上注册的监听器。 这些输出显示了消息消费者处理股票价格消息时的输出信息。一旦Publisher发布了1000个消息, Publisher将自动关闭。而Consumer类将一直运行并挂起以等待更多的消息发布到那个那个主题。 在第二个终端或者命令行窗口按CTRL+C键可停止Consumer类。
现在你看到ActiveMQ可在消息发布/订阅这一场景中正常运行, 下一节将介绍在ActiveMQ中如何使用点对点消息。
网友评论