本样例程序使用rabbitmq消息队列模拟了一个简单的股票交易系统,它基本上等同于Spring AMQP的一个样例程序stocks,只是做了一些增强性的配置以使其能够在Cloud Foundry平台之上良好运行。

本程序repository:https://github.com/SpringSource/cloudfoundry-samples/tree/master/stocks

也可以参考其原版的Spring AMQP stocks样例:http://github.com/SpringSource/spring-amqp-samples

本程序对原版样例程序的增强之处在于,引入了Cloud Foundry平台的运行时环境变量,程序能够检测到运行时环境是在本地还是云平台,另外还使用到了Redis存储服务。

首先来看一下这个应用程序的UI。构建好程序并push到Cloud Foundry之后(需要绑定rabbitmq和redis两种云服务),在浏览器中访问应用程序,可看到类似以下的界面:

页面下方实时更新当前每支股票的交易价格。在上方股票交易区输入交易数目及股票代号后单击"Send",可显示详细的交易信息。这就是本程序所实现的全部应用场景。

一、RabbitMQ

股票交易信息和实时报价均通过RabbitMQ消息队列发送或获取。
交易信息的发送由 java/org/springframework/amqp/rabbit/stocks/gateway/RabbitStockServiceGateway.java 的 send() 方法完成:

public class RabbitStockServiceGateway extends RabbitGatewaySupport implements StockServiceGateway {private String defaultReplyTo;public void setDefaultReplyTo(String defaultReplyTo) {this.defaultReplyTo = defaultReplyTo;}public void send(TradeRequest tradeRequest) {getRabbitTemplate().convertAndSend(tradeRequest, new MessagePostProcessor() {public Message postProcessMessage(Message message) throws AmqpException {message.getMessageProperties().setReplyTo(new Address(defaultReplyTo));try {message.getMessageProperties().setCorrelationId(UUID.randomUUID().toString().getBytes("UTF-8"));}catch (UnsupportedEncodingException e) {throw new AmqpException(e);}return message;}});}}

对RabbitStockServiceGateway bean进行配置,将交易信息发送到制定的rabbit队列中。见 resources/servlet-config.xml 文件:

<bean id="stockServiceGateway" class="org.springframework.amqp.rabbit.stocks.gateway.RabbitStockServiceGateway"><property name="rabbitTemplate"><rabbit:template connection-factory="connectionFactory" routing-key="app.stock.request"message-converter="jsonMessageConverter" /></property><property name="defaultReplyTo" value="fanout://broadcast.responses/" /></bean>

实时报价则是通过 java / org / springframework / amqp / rabbit / stocks / gateway / RabbitMarketDataGateway.java 来模拟。之所以说是模拟,因为这里的报价是随机产生的符合正态分布的随机数,并非实际股票市场的报价。见代码:

private String randomPrice() {return this.twoPlacesFormat.format(this.basePrice + Math.abs(random.nextGaussian()));}

二、Redis

该应用程序的运行并未直接使用redis存储服务。这里绑定redis服务,是为了能够更改并持久化应用程序的参数配置,比如报价的刷新频率。
程序默认的实时报价更新频率为5秒,可通过以下方式更改:

$ curl http://stocks.vcap.me/refresh/trigger -d quote.trigger="0 * * * * *"

这里将默认的CronTrigger配置由"0/5 * * * * *",即每5秒,更改为每分钟。

通过执行命令

$ curl http://stocks.vcap.me/env 

或在浏览器中访问地址 http://stocks.vcap.me/env ,可以看到环境变量 env 已经更改成功:

…… ,"env":{"quote.trigger":"0 * * * * *"}}

env 变量被持久化存储于Redis中。

Cloud Foundry samples学习笔记9:模拟股票交易系统stocks相关推荐

  1. python爬虫学习笔记2模拟登录与数据库

    前言 为了加入学校里面一个技术小组,我接受了写一个爬取学校网站通知公告的任务.这个任务比以前写的爬虫更难的地方在于,需要模拟登录才能获得页面,以及将得到的数据存入数据库. 本文按照日期来记录我完成任务 ...

  2. 基于flask+vue的模拟股票交易系统

    开发工具(eclipse/idea/vscode等):pycharm+hbuilder 数据库(sqlite/mysql/sqlserver等):sqlite 功能模块(请用文字描述,至少200字): ...

  3. JAVA学习笔记33——模拟实现HandSet+数据存储综合练习(javabean版+容器板)

    最近在看JAVA教学的视频,觉得老师讲的很好,同时借用源代码还有笔记来撰写本系列博客,记录自己的学习内容,同时也供看到的人学习. 本篇第一个内容是模拟实现HandSet,其实这个模拟和之前的相比简陋了 ...

  4. spring cloud bus AMQP学习笔记

    spring cloud bus AMQP 三种jar包 spring-cloud-bus 源包 spring-cloud-starter-bus-amqp 整合了RabbitMQ spring-cl ...

  5. node.js学习笔记之模拟路由

    路由就是浏览器输入url地址,服务端根据对url地址的解析,访问对应的代码模块. var    http    =    require('http'); var    url    =    req ...

  6. python3爬虫学习笔记之模拟淘宝登录

    准备工作 使用chrome f12调试模式,抓包查看淘宝登录的整个流程,并查看post请求的数据 值得注意的是,淘宝用的是gbk编码 说明 此版本没有处理验证码,只是单纯的登录 具体的流程和实现都在代 ...

  7. stm32学习笔记 ADC模拟数字转换器 ADC模数转化器详解

         一.为什么要使用ADC模拟数字转换器     STM32主要是数字电路,数字电路只有高低电平,没有几V电压的概念,所以如果想要读取电压值,就需要借助ADC模数转化器来实现.可以说ADC是模拟 ...

  8. java模拟cpu返回_【学习笔记】模拟Java程序CPU100堆栈追踪

    cpu100排查 这里模拟一下排查过程 连接远程服务器 ssh root@yourServerAddress 编写测试出问题的代码 import java.util.concurrent.TimeUn ...

  9. 数学建模学习笔记——蒙特卡洛模拟

    n=3  abca acba n=4   3!

最新文章

  1. replace和replacAll
  2. 10个Github热门Python库,非常实用!
  3. java加载自己写的类_java 自定义类加载器从磁盘或网络加载类
  4. spring学习(7):加入log4g日志系统
  5. MySQL之索引优化
  6. python 求子字符串_求子串-KPM模式匹配-NFA/DFA
  7. jni ndk_带有NDK的Android JNI应用程序
  8. VS2017离线安装过程及下载缓慢处理(项目打包部署)
  9. cad卸载工具_Adobe软件卸载与常见问题解决方案
  10. 植物大战僵尸最全最新版修改存档
  11. 一份超详细的UI设计规范全攻略
  12. 部署Guacamole远程控制桌面
  13. 软件测试面试题:WEB+网络|接口测试|性能测试|自动化测试
  14. python 可以用excel做词云图嘛_今天从零教你开始利用Python打造词云图!
  15. 命令python所在的驱动器和文件夹_Python文件夹与文件的操作-阿里云开发者社区...
  16. imap 已读回执_停止烦恼已读回执
  17. Verilog数字系统设计——4 选1 多路选择器
  18. Oracle Notification云服务(ONS)快速入门
  19. IO流02--毕向东JAVA基础教程视频学习笔记
  20. 分享一款办公辅助工具 迅捷文档转换

热门文章

  1. virtex7 linux,Zynq 之Zedboard Ubuntu
  2. Vue教程|vue3.0入门到精通,持续更新
  3. 基于树莓派对Linux内核简单认识
  4. Unity异步加载场景
  5. 基于FPGA的一维卷积神经网络CNN的实现(三)训练网络搭建及参数导出(附代码)
  6. 在ubunut 12.04 server 上部署 edx
  7. P4999 烦人的数学作业
  8. 微信发语音,会被上司和客户骂?老外都知道这事儿了
  9. Python中的迭代器和生成器
  10. cv2.imshow报错 window.cpp:1274: error: (-2:Unspecified error) The function is not implemented.