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
分享到:
相关推荐
若有队列: Q =(q1,q2,…,qn) 那么,q1为队头元素(排头元素),qn为队尾元素。队列中的元素是按照q1,q2,…,qn的顺序进入的,退出队列也只能按照这个次序依次退出,即只有在q1,q2,…,qn-1都退队之后,qn才能...
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 ...
3.3 平衡查找树 3.3.1 2-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.2) edge_消除 基本上可以在输入图上运行(3.3) 但是,可能存在一个错误:常规约束,它可能会消除比预期更多的边缘(3.3) 实施中 输入边缘
3.3 平衡查找树 269 3.3.1 2-3查找树 269 3.3.2 红黑二叉查找树 275 3.3.3 实现 280 3.3.4 删除操作 282 3.3.5 红黑树的性质 284 3.4 散列表 293 3.4.1 散列函数 293 3.4.2 基于拉链法的散...
3.3 平衡査找树 269 3.3.1 2-3査找树 269 3.3.2 红黑二叉查找树 275 3.3.3 实现 280 3.3.4 删除操作 282 3.3.5 红黑树的性质 284 3.4 散列表 293 3.4.1 散列函数 293 3.4.2 基于拉链法的散列表 297...
3.3 平衡查找树 269 3.3.1 2-3查找树 269 3.3.2 红黑二叉查找树 275 3.3.3 实现 280 3.3.4 删除操作 282 3.3.5 红黑树的性质 284 3.4 散列表 293 3.4.1 散列函数 293 3.4.2 基于拉链法的散列表 297 3.4.3 ...
3.3. Spring配置文件 这里配置了数据源、事务管理、流程引擎及几个必要的xxxService。这里数据源使用的是dbcp。数据库信息就配置成你自己本地数据库的信息,如果不会配置。 destroy-method="close"> ...
• 数组(静态数组、动态数组)、线性表、链表(单向链表、双向链表、循环链表)、队列、栈、树(二叉树、查找树、平衡树、线索树、线索树、堆)、图等的定义、存储和操作 • Hash(存储地址计算,冲突处理) ...