`
JFires
  • 浏览: 41733 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

3.2用例一:股票投资例子

阅读更多

3.2用例一:股票投资例子

就像之前提到的,我们第一个用例是使用股票投资的例子来展示发布/订阅的消息传送机制。这个例子使用一个Publisher类来发送一条股票价格消息到一个主题,同时,注册了Listener的Consumer类用异步方式从主题消费消息。这三个类体现了如何产生不停变换的股票消息并发送到被消费者订阅到主题上。

    在这个例子中,股票价格被发布的任意数量的主题上。主题的数量是由命令行携带给发布者和消费者的参数数量决定的。每一个类会动态地向/从主题发送或接收消息。图3.2和3.3在一个高层次上展示了这些例子要达到的目的。

    为了这个演示,两个主题将被使用。Publisher类使用一个单独的JMS MessageProducer以每次10条的方式去发送1000虚拟的股票消息,并随机地发送到由命令行参数所指明的各个主题上。发送完1000条消息,它将被关闭。Consumer类对每个主题都创建了一个MessageConsumer并且注册一个JMS MessageListener。因为这个例子是演示发布/订阅消息的,所以消费者必须在线消费消息(这个例子不使用持久订阅。)。下一步是真正地运行这个例子,这样你就能看到它们的动作了。


3.2.1运行股票投资例子

运行例子有以下步骤:

  1. 启动ActiveMQ
  2. 运行Consumer类
  3. 运行Publisher类

这些步骤看起来很简单。要注意的是,Consumer类必须比Publisher类先启动,这样它才能接收到所有的消息。这是因为这个例子是用来演示发布/订阅消息模式的,所以主题并不会为客户端保存消息(我们没有用持久订阅)。现在让我们开始这个例子吧。

    首先,我们要打开一个终端或者命令行来运行ActiveMQ。这个只需一条命令,如下所示:

Listing 3.2 Start up ActiveMQ

[apache-activemq-5.4.1] $ ./bin/activemq console
INFO: Using default configuration
(you can configure options in one of these file:
/etc/default/activemq /Users/bsnyder/.activemqrc)
INFO: Invoke the following command to create a configuration file
./bin/activemq setup [/etc/default/activemq | /Users/bsnyder/.activemqrc]
INFO: Using java
'/System/Library/Frameworks/JavaVM.framework/Home/bin/java'
INFO: Starting in foreground, this is just for debugging purposes
(stop process by pressing CTRL+C)
Java Runtime: Apple Inc. 1.6.0_20
/System/Library/Frameworks/JavaVM.framework/Versions/1.6.0/Home
Heap sizes: current=258880k free=253105k max=258880k
JVM args: -Xms256M -Xmx256M

-Dorg.apache.activemq.UseDedicatedTaskRunner=true
-Djava.util.logging.config.file=logging.properties
-Dcom.sun.management.jmxremote
-Dactivemq.classpath=/Users/bsnyder/amq/apache-activemq-5.4.1/conf;
-Dactivemq.home=/Users/bsnyder/amq/apache-activemq-5.4.1
-Dactivemq.base=/Users/bsnyder/amq/apache-activemq-5.4.1
ACTIVEMQ_HOME: /Users/bsnyder/amq/apache-activemq-5.4.1
ACTIVEMQ_BASE: /Users/bsnyder/amq/apache-activemq-5.4.1
Loading message broker from: xbean:activemq.xml
...
INFO | Started SelectChannelConnector@0.0.0.0:8161

 

下一个任务是打开第二个终端(或命令行)来运行Consumer类。我们使用maven-exec-plugin来运行Consumer类。使用这个plugin时我们通过exec.args属性来传递一些系统参数。运行Consumer的例子如下:

Listing 3.3 Run the stock portfolio consumer

[amq-in-action-example-src] $ mvn exec:java \ -
Dexec.mainClass=org.apache.activemq.book.ch3.portfolio.Consumer \ -
Dexec.args="CSCO ORCL"

[INFO] Scanning for projects...
[INFO] Searching repository for plugin with prefix: 'exec'.
[INFO] org.apache.maven.plugins: checking for updates from central
[INFO] org.codehaus.mojo: checking for updates from central
[INFO] artifact org.codehaus.mojo:exec-maven-plugin: checking for
updates from central
[INFO] snapshot org.codehaus.mojo:exec-maven-plugin:1.1.2-SNAPSHOT:
checking for updates from public-snapshots
[INFO] snapshot org.codehaus.mojo:exec-maven-plugin:1.1.2-SNAPSHOT:
checking for updates from central
Downloading:
http://localhost:8081/nexus/content/groups/public/org/codehaus/mojo/
exec-maven-plugin/1.1.2-SNAPSHOT/
exec-maven-plugin-1.1.2-20091120.114446-3.pom
4K downloaded (exec-maven-plugin-1.1.2-20091120.114446-3.pom)
Downloading:
http://localhost:8081/nexus/content/groups/public/org/codehaus/mojo/
mojo-parent/22/mojo-parent-22.pom
18K downloaded (mojo-parent-22.pom)
Downloading:
http://localhost:8081/nexus/content/groups/public-snapshots/org/codehaus/
mojo/exec-maven-plugin/1.1.2-SNAPSHOT/
exec-maven-plugin-1.1.2-20091120.114446-3.jar
36K downloaded (exec-maven-plugin-1.1.2-20091120.114446-3.jar)
[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.
Downloading:
http://localhost:8081/nexus/content/groups/public/org/apache/commons/
commons-exec/1.0.1/commons-exec-1.0.1.pom
7K downloaded (commons-exec-1.0.1.pom)
Downloading:
http://localhost:8081/nexus/content/groups/public/org/apache/commons/
commons-exec/1.0.1/commons-exec-1.0.1.jar
48K downloaded (commons-exec-1.0.1.jar)
[INFO] [exec:java {execution: default-cli}]

 

在列表3.3你可以看到Maven下载了一些运行例子必须的组件。当Consumer启动完毕,我们就可以启动Publisher并开始发送股票消息到两个有命令行参数指定的目标CSCO和ORCL。这两个名字是随机取的,你可以改为其它任意字符串。重要的是Consumer和Publisher必须使用相同的参数。

运行Consumer时构建错误

当你运行Consumer类时,如果你看到BUILD ERROR,那么你必须先编译源代码,然后再运行它。下面的命令可以用来编译源代码:$ mvn clean install    这个命令编译并打包源代码。之后你可以用原先的命令来运行Consumer类了。

注意,现在输出已经停了,看起来就像Consumer挂起来。这是正常的,因为它正在等待消息。当Publisher开始发送消息,Consumer就会开始消费它们。

 

在输出窗口为什么看到所有的组件都是从本地下载?

在3.1接如果Maven正确安装,那么它会下载运行例子所需要所有组件。在第一个输出窗口你可以看到它在下载组件。注意到所有的组件都是从本地下载而不是从远程Maven库下载。这是因为这些例子已经被配置为使用一个叫做Nexus的位于本地计算机的Maven库。Nexus提供很多好处,其中一个是它可以作为远程Maven库的代理缓存所有已下载组件。在Maven第一次下载组件后,它们都被保存到本地缓存里。如果多次编译,Nexus从本地缓存提供组件,这加快了编译速度。更多关于Nexus的消息请看:http://nexus.sonatype.org/

 

接下来我们打开第三个终端来运行Publisher类。注意在exec.args中必须使用与原来运行Consumer相同的参数,因为maven-exec-plugin也会用这些参数来运行Publisher。下面是运行Publisher的例子。

Listing 3.4 Running the stock portfolio publisher

[amq-in-action-example-src] $ mvn exec:java \
-Dexec.mainClass=org.apache.activemq.book.ch3.portfolio.Publisher \
-Dexec.args="CSCO ORCL"
[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: {offer=62.6861410176471, price=62.62351750014696, up=true,
stock=ORCL} on destination: topic://STOCKS.ORCL
Sending: {offer=55.508573596887715, price=55.45312047641131, up=true,
stock=CSCO} on destination: topic://STOCKS.CSCO
Sending: {offer=62.527946513790205, price=62.46548103275745, up=false,
stock=ORCL} on destination: topic://STOCKS.ORCL
Sending: {offer=55.78778713074073, price=55.73205507566507, up=true,
stock=CSCO} on destination: topic://STOCKS.CSCO
Sending: {offer=55.593918646251986, price=55.53838026598601, up=false,
stock=CSCO} on destination: topic://STOCKS.CSCO
Sending: {offer=55.83360390719586, price=55.777826081114746, up=true,
stock=CSCO} on destination: topic://STOCKS.CSCO
Sending: {offer=55.99233608275527, price=55.93639968307221, up=true,
stock=CSCO} on destination: topic://STOCKS.CSCO
Sending: {offer=62.006501598331475, price=61.94455704129019, up=false,
stock=ORCL} on destination: topic://STOCKS.ORCL
Sending: {offer=55.53698948617822, price=55.48150797820003, up=false,
stock=CSCO} on destination: topic://STOCKS.CSCO
Sending: {offer=61.43866500377897, price=61.377287716062916, up=false,
stock=ORCL} on destination: topic://STOCKS.ORCL
Published '10' of '10' price messages
Sending: {offer=55.466945358331216, price=55.41153382450671, up=false,
stock=CSCO} on destination: topic://STOCKS.CSCO
Sending: {offer=61.27694222131968, price=61.215726494824864, up=false,
stock=ORCL} on destination: topic://STOCKS.ORCL
...
Published '10' of '30' price messages
...

 

运行Publisher时,由于Maven在之前运行Consumer时已经下载了所有的依赖组件,所以无需再下载了。在输出窗口下半部分可以看到,股票价格消息每10条一组发送到了两个主题。由于输出太多,部分没有显示在上面,但是要知道Publisher将会一直运行直到发送完1000条消息。

    运行完Publisher,现在切换到第二个终端,你可以看到Consumer正在从主题上消费消息。

...
[INFO] [exec:java {execution: default-cli}]
ORCL 62.62 62.69 up
CSCO 55.45 55.51 up
ORCL 62.47 62.53 down
CSCO 55.73 55.79 up
CSCO 55.94 55.99 up
CSCO 55.41 55.47 down
ORCL 61.22 61.28 down
ORCL 61.42 61.48 up
...

输出的前缀是注册到ORCL和CSCO主题上的监听器打印出来的。这个输出说明了现在正在消费由Publisher发送到两个主题的消息。当Publisher发送我1000条消息后,它将被关闭。但是Consumer仍会继续运行并挂起等待更多的消息。你可以在第二个终端按CTRL-C来关闭Consumer。

    现在你已经看到ActiveMQ怎样以发布/订阅模式运行,下一节将展示它如何以点对点消息传送方式运行。

  • 大小: 46.9 KB
1
1
分享到:
评论

相关推荐

    物流配送系统用例文档

    1.2.1 用例编号:UC7.1.1 用例名:生成报表……………………….. 1.2.1.1 用例编号:UC7.1.1.1 用例名:生成收货报表……….. 1.2.1.2 用例编号:UC7.1.1.2 用例名:生成发货报表……….. 1.2.1.3 用例编号:UC7.1....

    用例学习:JUnit

    用例学习:JUnit

    网络选课用例图

    用例名称:查看选课 用例描述:查看学生自己的选课信息 前置条件:学生登录进入系统 后置条件:显示选课信息 基本操作流程: 1. 学生点击学生选课情况 2. 通过条件筛选选课信息(如什么学年什么学期) 3. 显示相...

    Excel 2010函数应用速查手册

    源文件:光盘\源文件\02\032.xlsx 用例31:计算实际年利率(EFFECT) 源文件:光盘\源文件\02\033.xlsx 用例32:计算名义利率(NOMINAL) 源文件:光盘\源文件\02\034.xlsx 用例33:计算股票的收益率(ODDLYIELD) ...

    强化测试用例设计:问题驱动的软件测试设计

    测试用例设计是整个软件测试过程中非常重要的测试活动,需求规格说明是测试人员开展测试设计的主要参考输入。而在测试实践中基于需求规格说明得到的测试用例,在测试覆盖率、测试效率、测试有效性和测试质量等方面的...

    用例模板:”提交订单“用例文档示例.docx

    绘制用例图只是完成了用例建模最基本也是最简单的一步,用例...顾名思义,用例文档是用于描述用例的文档,每一个用例对应于一个用例文档,在用例文档中需要用文字的方式描述用例的执行过程,即执行者与系统的交互过程。

    测试用例设计:测试用例的基本概念 测试用例的设计和编写 测试用例评估 测试用例的管理

    测试用例的基本概念 测试用例的设计和编写 测试用例评估 测试用例的管理

    软件测试中如何进行增加、编辑、删除和密码修改测试用例

    几乎每个系统都会用到,针对这几个方面,写如下测试用例一:增加1:在添加页面,输入要添加的数据项均合理,检查数据库以及列表页是否添加了相应的数据2:在添加页面,留出一个必填项为空,检查是否会提示3:按照...

    用例建模指南带具体例子

    用例建模指南:用具体的例子教会大家如何利用用例进行建模.

    UML实验报告(1).doc

    《面向对象与UML》 实验报告 实验一 UML建模基础 一、实验目的 1. 熟悉UML建模工具Rational rose的可视化环境。 2. 掌握利用Rational rose进行建模的步骤。 二、实验内容 1. 熟悉Rational rose建模环境 2. 建模基本...

    在线考试用例图

    用例名称:在线考试 用例描述:查看学生自己的选课信息 前置条件:考试者登录进入系统 后置条件:自动显示考试成绩 基本操作流程: 1. 学生点击在线考试栏目 2. 点击选择考试科目 3. 系统随机调用试卷 4. 做完试卷...

    华山论剑之测试用例编写规范

    测试用例编写规范 1 目的 2 用途 3 用例规范 3.1 用例设计流程 测试用例的分析和设计: ...3.2 测试用例组成部分 3.3 编写用例原则 3.4 用例级别划分 3.5 用例的维护 4 用例常用设计方法 5.需要考虑的测试点参考文档

    服务子系统用例图+用例子图+用例描述1

    服务子系统用例图:二层用例图:用例描述:用例名称:预订订单用例标识号:001参与者:普通客户,预订负责人简要说明:普通客户可以凭手机号预订订单,预订成功会收到一

    C#项目案例:QQ用户信息管理系统.rar

    用例1:创建数据库、表 用例2:管理员登录 用例3:显示菜单功能 用例4:显示QQ用户全部信息功能 用例5:更新在线天数 用例6:添加用户 用例7:更新用户等级 检索用户编号和在线天数 等级判定 更新用户信息 ...

    测试用例设计模板及例子

    测试用例设计模板及例子 例子是登陆用例测试

    【软件测试】: 测试用例:场景法设计测试用例.doc

    【软件测试】: 测试用例:场景法设计测试用例.doc

    【软件测试】: 测试用例:因果图法设计测试用例.doc

    【软件测试】: 测试用例:因果图法设计测试用例.doc

    【软件测试】: 测试用例:基本路径测试法用例编写的方法.doc

    【软件测试】: 测试用例:基本路径测试法用例编写的方法.doc

    软件测试之-测试用例.m4a

    需求分析—测试需求—测试计划—测试方案—测试用例—执行测试—测试报告 测试用例理论 划分等价类 边界值分析 测试用例理论 测试用例:指导测试,是测试的依据,输入(数据、文件、)操作步骤执行条件,预期结果 ...

    UML建模:用例图,类图等

    用例图一般表示出用例的组织关系--要么是整个系统的全部用例,要么是完成具有功能(例如,所有安全管理相关的用例)的一组用例。要在用例图上显示某个用例,可绘制一个椭圆,然后将用例的名称放在椭圆的中心或椭圆...

Global site tag (gtag.js) - Google Analytics