3.3用例二:工作队列
第二个例子通过工作队列来演示点对点的消息传送。这个例子使用Producer类来向工作队列发送消息,而注册了Listener的Consumer类则用异步的方式从队列消费消息。这3个类展示了基本的JMS点对点消息传送是如何工作的。这些类和上一个例子很相似,区别就是用在不同的消息传送领域。
Producer类发送消息到JOBS.suspend和JOBS.delete队列,Consumer则消费它们。图3.3在一个高层次描述了这个过程。
Producer使用一个单独的MessageProducer来发送1000条工作消息,每次10条,随机地发送到两个队列。发完1000条消息后关闭。Consumer类对每一个队列使用一个MessageConsumer并注册一个JMS MessageListener来使用消息并输出相关信息。
3.3.1 运行工作队列例子
运行工作队列的步骤几乎和前一个例子的步骤一样:
- 启动ActiveMQ
- 运行Producer类
- 运行Consumer类
这些步骤都很简单,但有一个地方要注意。我们现在使用的是点对点消息传送,队列会保存消息直到它们被消费或者过期。所以即使Produce先于Consumer启动,Consumer也不会错失任何消息。
就像股票投资例子一样,第一个步骤是启动ActiveMQ。这个步骤就不再详述了,因为它和之前完全一样。
接上来,打开第二个终端或命令行窗口来运行Producer。
Listing 3.5 Running the job queue publisher
[amq-in-action-example-src] $ mvn exec:java \
-Dexec.mainClass=org.apache.activemq.book.ch3.jobs.Publisher
[INFO] Scanning for projects...
[INFO] Searching repository for plugin with prefix: 'exec'.
[INFO] -------------------------------------------------------------------
-----
[INFO] Building ActiveMQ in Action Examples
[INFO] task-segment: [exec:java]
[INFO] -------------------------------------------------------------------
-----
[INFO] Preparing exec:java
[INFO] No goals needed for project - skipping
[WARNING] POM for 'woodstox:wstx-asl:pom:3.2.7:compile' is invalid.
Its dependencies (if any) will NOT be available to the current build.
[INFO] [exec:java {execution: default-cli}]
Sending: id: 1000000 on queue: queue://JOBS.delete
Sending: id: 1000001 on queue: queue://JOBS.delete
Sending: id: 1000002 on queue: queue://JOBS.delete
Sending: id: 1000003 on queue: queue://JOBS.delete
Sending: id: 1000004 on queue: queue://JOBS.delete
Sending: id: 1000005 on queue: queue://JOBS.delete
Sending: id: 1000006 on queue: queue://JOBS.delete
Sending: id: 1000007 on queue: queue://JOBS.delete
Sending: id: 1000008 on queue: queue://JOBS.delete
Sending: id: 1000009 on queue: queue://JOBS.delete
Published '10' of '10' job messages
Sending: id: 1000010 on queue: queue://JOBS.delete
Sending: id: 1000011 on queue: queue://JOBS.suspend
...
Published '10' of '30' job messages
...
注意运行Producer时并不需要传递任何参数。Publisher类包含了两个队列delete和suspend。这清楚地显示在输出内容上。Producer会发送1000条消息然后关闭。
接下来的任务是打开另一个终端或命令行窗口来运行Consumer,Consumer会从两个队列消费消息。这个命令如下:
Listing 3.6 Running the job queue consumer
[amq-in-action-example-src] $ mvn exec:java \
-Dexec.mainClass=org.apache.activemq.book.ch3.jobs.Consumer
[INFO] Scanning for projects...
[INFO] Searching repository for plugin with prefix: 'exec'.
[INFO] -------------------------------------------------------------------
-----
[INFO] Building ActiveMQ in Action Examples
[INFO] task-segment: [exec:java]
[INFO] -------------------------------------------------------------------
-----
[INFO] Preparing exec:java
[INFO] No goals needed for project - skipping
[WARNING] POM for 'woodstox:wstx-asl:pom:3.2.7:compile' is invalid.
Its dependencies (if any) will NOT be available to the current build.
[INFO] [exec:java {execution: default-cli}]
suspend id:1000003
suspend id:1000010
suspend id:1000012
suspend id:1000013
suspend id:1000015
suspend id:1000022
suspend id:1000025
suspend id:1000027
delete id:1000000
delete id:1000001
delete id:1000002
delete id:1000004
delete id:1000005
...
一开始,Consumer会运行得很快,消费完队列里所有的消息。当它赶上Producer时,Consumer开始慢下来,然后和Producer同步,直到Producer发送完1000条消息。当所有的消息发送完后,Producer自动终止,而Consumer不会,你需要在第三个终端上按CTRL-C来停止它。
工作队列的例子结束了。现在你看到了ActiveMQ是如何以点对点消息传送方式工作的。
3.4总结
对本书例子的简单介绍的目的在于--快速和专注。工作和投资的例子在商业领域是很常见的,但这只是消息传送领域大量例子中的两个。虽然这两个例子只是在一个较高层次演示了两种消息传送领域,但它们还有其它作用。通过使用ActiveMQ提供的特性,这两个例子将在本书剩下部分被修改。所以你会经常看到这两个例子,不过稍有不同而已。
本书的第一部分(1~3章)先向你介绍了ActiveMQ,使你对ActiveMQ有一个高层次的理解。接下来是关注面向消息中间件和JMS规范。虽然这些主题不只是与ActiveMQ有关,但对于理解ActiveMQ很有帮助。你也看了一些例子,这些例子将在整本书中使用。第一部分的内容是掌握ActiveMQ的热身,第二部分你将学会对ActiveMQ的连接,持久化,安全等各个方面进行配置。
- 大小: 45.3 KB
分享到:
相关推荐
通过本项目的设计与实现,我们不仅能够深入理解多级队列调度算法的工作原理,还能够熟悉数据结构和算法的设计与应用。同时,该项目也为后续学习操作系统和计算机体系结构提供了坚实的理论基础和实践经验。 #### ...
算法可能基于优先级队列或贪心策略,首先对所有请求进行排序,然后选择最接近当前电梯位置的请求,或者根据电梯的满载情况和未来需求做出决策。 1.3 算法程序流程: - 收集电梯状态和乘客请求。 - 对请求进行排序或...
这个压缩包包含的资源是"The Annotated STL Sources V3.3",这是一个针对SGI-STL的详细注释版本,帮助开发者深入理解STL的内部工作机制。 STL(Standard Template Library,标准模板库)是C++的一个重要组成部分,...
- **测试用例设计**:为了验证程序是否符合预期的行为,需要设计一系列的测试用例。 - **软件测试的实施**:包括单元测试、集成测试和系统测试等多个阶段。 #### 3.5 程序的调试 - **静态调试**:在程序运行之前...
- **测试用例**:设计多种不同的测试用例,覆盖各种可能的场景。 - **运行结果分析**:根据测试结果分析程序的正确性和效率。 - **性能评估**:评估程序在不同负载下的性能表现。 #### 5. 自我评价与总结 - **优点...
#### 二、安装 ##### 2.1 系统需求 - **操作系统**: 支持 Windows 和部分 Unix/Linux 操作系统。 - **Oracle 客户端**: 需要安装 Oracle 客户端软件。 - **其他**: 可能还需要安装 Java 运行环境等依赖软件。 ####...
- **准备工作**:讲解在编写程序之前需要做的准备工作,比如设置工作环境、创建必要的文件等。 - **实例演示**:提供具体的操作步骤,帮助读者快速上手。 ##### 2.3 简单的程序流程 - **流程介绍**:介绍一个简单...
本次实验旨在通过编程实现二叉树的各种遍历算法及其子树交换功能,帮助学生深入理解二叉树的基本概念和遍历算法的工作原理。通过实际编程练习,学生可以进一步掌握二叉树的链式存储结构以及不同遍历方法的特点。 ##...
- **2.6 涉及的MQ变更**:MQ(消息队列)用于异步处理数据,记录相关的MQ配置和变更点。 - **2.7 存量数据处理**:针对已存在的数据,制定迁移策略,确保数据的一致性和完整性。 - **2.8 灰度验证**:采用灰度发布的...
若有队列: Q =(q1,q2,…,qn) 那么,q1为队头元素(排头元素),qn为队尾元素。队列中的元素是按照q1,q2,…,qn的顺序进入的,退出队列也只能按照这个次序依次退出,即只有在q1,q2,…,qn-1都退队之后,qn才能...
3.3 参考用图是用于验证算法正确性的有向图实例。 四、数据结构选择与概要设计 1) 采用邻接矩阵作为数据存储结构,以二维数组`edges[MAX_VERTEX_NUM][MAX_VERTEX_NUM]`表示图的边及其权重。邻接矩阵中,`edges[i]...
#### 二、安装 ##### 2.1 系统需求 - **操作系统**: 支持 Windows 操作系统。 - **Oracle 客户端**: 需要安装 Oracle 客户端软件来确保能够与 Oracle 数据库进行通信。 - **其他软件**: 可能还需要安装其他辅助软件...
- **自动引用计数(ARC)**:Xcode 自动处理对象的内存管理,简化了开发过程中的内存管理工作。 - **4.2 内存管理规则** - **所有权原则**:每个对象都有一个所有者,所有者负责管理该对象的内存生命周期。 - **...
- **测试用例**:如何将示例转化为测试用例。 #### 总结 RT-Thread是一款功能强大的嵌入式实时操作系统,不仅支持多种硬件平台,还提供了丰富的功能模块。通过深入了解其核心技术原理和开发实践,可以帮助开发者更...
3.3 平衡查找树 3.3.12—3查找树 3.3.2 红黑二叉查找树 3.3.3 实现 3.3.4 删除操作 3.3.5 红黑树的性质 3.4 散列表 3.4.1 散列函数 3.4.2 基于拉链法的散列表 3.4.3 基于线性探测法的散列表 3.4.4 调整...
3.1.3 用例举例 233 3.1.4 无序链表中的顺序查找 235 3.1.5 有序数组中的二分查找 238 3.1.6 对二分查找的分析 242 3.1.7 预览 244 3.2 二叉查找树 250 3.2.1 基本实现 250 3.2.2 ...
为了提高工作效率、降低成本并优化资源分配,开发一个高效稳定的管理系统变得尤为重要。本项目旨在通过Java技术栈构建一套完整的管理系统,满足企业的日常运营需求。 #### 1.2 项目目标 - 开发一个功能全面且易于...
时间复杂度描述了执行算法所需要的计算工作量,而空间复杂度则反映了算法在运行过程中临时占用存储空间大小。 1.2 数据结构 数据结构是组织和管理数据的方式,分为逻辑结构和存储结构。逻辑结构关注数据元素之间的...