hazelcast 使用_使用Hazelcast发布和订阅

hazelcast 使用

几周前,我写了一篇有关Hazelcast入门的博客,描述了创建分布式地图,列表和队列是多么简单。 当时我提到,Hazelcast还做很多其他事情。 该博客快速介绍了Hazelcast的另一个功能:基于Publish / Subscribe模式的广播消息系统。 这采用通常的格式,即邮件发件人应用通过该格式发布有关特定主题的邮件。 消息不针对任何特定的客户端,但是可以由对主题感兴趣的任何客户端读取。

发布和订阅的明显场景来自高金融和做市商的世界。 做市商买卖股票之类的金融工具,并通过在通常是电子市场中的买卖价格广告来竞争业务。 为了使用Hazelcast实现非常简单的做市商方案,我们需要三个类: StockPrice bean, MarketMakerClient

以下代码已添加到我在Github上可用的现有Hazelcast项目中。 无需担心其他POM依赖项。

public class StockPrice implements Serializable { private static final long serialVersionUID = 1L; private final BigDecimal bid; private final BigDecimal ask; private final String code; private final String description; private final long timestamp; /** * Create a StockPrice for the given stock at a given moment */ public StockPrice(BigDecimal bid, BigDecimal ask, String code, String description, long timestamp) { super(); this.bid = bid; this.ask = ask; this.code = code; this.description = description; this.timestamp = timestamp; } public BigDecimal getBid() { return bid; } public BigDecimal getAsk() { return ask; } public String getCode() { return code; } public String getDescription() { return description; } public long getTimestamp() { return timestamp; } @Override public String toString() { StringBuilder sb = new StringBuilder("Stock - "); sb.append(code); sb.append(" - "); sb.append(description); sb.append(" - "); sb.append(description); sb.append(" - Bid: "); sb.append(bid); sb.append(" - Ask: "); sb.append(ask); sb.append(" - "); SimpleDateFormat df = new SimpleDateFormat("HH:MM:SS"); sb.append(df.format(new Date(timestamp))); return sb.toString(); } 
}

StockPrice bean具有所有常用的获取器和设置器,可以在任何给定时间模拟股票的买价和买价(以正常语言进行买卖),并且MarketMaker类使用Hazelcast发布这些bean。

通常,做市商会在一种以上的金融工具中发布价格; 但是,为简单起见, MarketMaker在此演示中仅发布单个价格。

public class MarketMaker implements Runnable { private static Random random = new Random(); private final String stockCode; private final String description; private final ITopic<StockPrice> topic; private volatile boolean running; public MarketMaker(String topicName, String stockCode, String description) { this.stockCode = stockCode; this.description = description; this.topic = createTopic(topicName); running = true; } @VisibleForTesting ITopic<StockPrice> createTopic(String topicName) { HazelcastInstance hzInstance = Hazelcast.newHazelcastInstance(); return hzInstance.getTopic(topicName); } public void publishPrices() { Thread thread = new Thread(this); thread.start(); } @Override public void run() { do { publish(); sleep(); } while (running); } private void publish() { StockPrice price = createStockPrice(); System.out.println(price.toString()); topic.publish(price); } @VisibleForTesting StockPrice createStockPrice() { double price = createPrice(); DecimalFormat df = new DecimalFormat("#.##"); BigDecimal bid = new BigDecimal(df.format(price - variance(price))); BigDecimal ask = new BigDecimal(df.format(price + variance(price))); StockPrice stockPrice = new StockPrice(bid, ask, stockCode, description, System.currentTimeMillis()); return stockPrice; } private double createPrice() { int val = random.nextInt(2010 - 1520) + 1520; double retVal = (double) val / 100; return retVal; } private double variance(double price) { return (price * 0.01); } private void sleep() { try { TimeUnit.SECONDS.sleep(2); } catch (InterruptedException e) { e.printStackTrace(); } } public void stop() { running = false; } public static void main(String[] args) throws InterruptedException { MarketMaker bt = new MarketMaker("STOCKS", "BT.L", "British Telecom"); MarketMaker cbry = new MarketMaker("STOCKS", "CBRY.L", "Cadburys"); MarketMaker bp = new MarketMaker("STOCKS", "BP.L", "British Petrolium"); bt.publishPrices(); cbry.publishPrices(); bp.publishPrices(); } }

像往常一样,设置Hazelcast相当简单,上面MarketMaker类中的大多数代码与Hazelcast无关。 该课程分为两部分:建筑价格和出版价格。 构造函数接受三个参数,将其存储起来以备后用。 它还创建一个Hazelcast实例,并通过私有createTopic()方法注册一个名为"STOCKS"的简单主题。 如您所料,创建Hazelcast实例并注册主题需要两行代码,如下所示:

ITopic<StockPrice> createTopic(String topicName) { HazelcastInstance hzInstance = Hazelcast.newHazelcastInstance(); return hzInstance.getTopic(topicName); }

该类的其余部分使用线程来调用MarketMakerrun()方法来运行价格发布机制。 此方法生成随机出价,为关联的股票代码要价,并使用Hazelcast发布。 使用以下单行代码即可完成发布:

topic.publish(price);

MarketMaker类的最后一部分是main()方法,其作用是创建多个MarketMaker实例并使它们运行。

既然Hazelcast知道了我们不断变化的股票价格,接下来要做的就是整理客户代码。

public class Client implements MessageListener<StockPrice> { public Client(String topicName) { HazelcastInstance hzInstance = Hazelcast.newHazelcastInstance(); ITopic<StockPrice> topic = hzInstance.getTopic(topicName); topic.addMessageListener(this); } /** * @see com.hazelcast.core.MessageListener#onMessage(com.hazelcast.core.Message) */ @Override public void onMessage(Message<StockPrice> arg0) { System.out.println("Received: " + arg0.getMessageObject().toString()); } public static void main(String[] args) { new Client("STOCKS"); } }

与任何消息传递系统一样,消息发送者代码必须知道呼叫谁和呼叫什么。 客户端通过创建Hazelcast实例并在"STOCKS"主题中注册兴趣来实现“调用什么"STOCKS" ,方法与发布者相同,如下所示:

HazelcastInstance hzInstance = Hazelcast.newHazelcastInstance(); ITopic<StockPrice> topic = hzInstance.getTopic(topicName); topic.addMessageListener(this);

通过客户端实现Hazelcast的MessageListener接口及其单一方法onMessage()来实现“呼叫”

@Override public void onMessage(Message<StockPrice> arg0) { System.out.println("Received: " + arg0.getMessageObject().toString()); }

客户端代码的最后一部分是其main()方法,该方法创建一个客户端实例。

最后要做的是运行代码。 为此,我仅将所有必需的JAR文件放在一个目录中,只需考虑两个:hazel cast-3.1.jar和guava-13.0.1.jar。

屏幕截图2013年12月7日的10.51.43

完成后,我转到项目的classes目录:

cd /Users/Roger/git/captaindebug/hazelcast/target/classes

…并解雇了发布者

java -cp ./:/Users/Roger/tmp/mm/guava-13.0.1.jar:/Users/Roger/tmp/mm/hazelcast-3.1.jar com.captaindebug.hazelcast.pubsub.MarketMaker

……然后是客户。

java -cp ./:/Users/Roger/tmp/mm/guava-13.0.1.jar:/Users/Roger/tmp/mm/hazelcast-3.1.jar com.captaindebug.hazelcast.pubsub.Client

当然,如果您正在使用此粗略且准备就绪的技术在计算机上运行此程序,则请记住将其替换
/Users/Roger/tmp/mm ,以及放置这些JAR文件副本的路径。

如果您在一个终端中运行MarketMaker发布者,并在其他两个终端中运行几个客户,那么您将得到类似的信息,在这里您可以看到正在发布的价格以及客户正在接收更新。

屏幕截图2013年12月22日的17.40.07

关于Hazelcast的一件事要注意的是,“ 集群 ”是指Hazelcast实例的集群,而不是JVM的集群。 除非您为每个应用程序请求多个Hazelcast实例,否则这是不明显的。 当其他客户端加入群集时,您将看到类似以下内容:

Members [5] {
Member [192.168.0.7]:5701
Member [192.168.0.7]:5702
Member [192.168.0.7]:5703
Member [192.168.0.7]:5704 this
Member [192.168.0.7]:5705
}

在上面的日志中,有两个侦听器条目,每个侦听器条目一个,每个发布者条目三个,在MarketMakermain()方法中启动的每个MarketMaker实例一个。

屏幕快照2013-12-07 at 11.16.21
这里要考虑的事情是,是否是每个对象实例创建一个Hazelcast实例的好习惯(就像我在示例代码中所做的那样),还是在代码中拥有一个static Hazelcast实例更好。 我不确定该答案是什么,所以如果有任何Hazelcast专家正在阅读此书,请告诉我。

就是这样:Hazelcast可以在发布和订阅模式下愉快地运行,但是我还没有介绍Hazelcast的所有功能。 也许以后再说……

  • 可以在Github上获得此源代码: https : //github.com/roghughe/captaindebug/tree/master/hazelcast

参考: Captain Debug的Blog博客上的JCG合作伙伴 Roger Hughes的Hazelcast发布和订阅 。

翻译自: https://www.javacodegeeks.com/2014/01/publish-and-subscribe-with-hazelcast.html

hazelcast 使用

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/345827.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

谱半径

矩阵的谱或叫矩阵的谱半径&#xff0c;在特征值估计、广义逆矩阵、数值分析以及数值代数等理论的建树中&#xff0c;都占有极其重要的地位&#xff1b; 矩阵的谱半径为矩阵的特征值的模的最大值。 关于矩阵的谱&#xff08;半径&#xff09;的一个重要性质即是&#xff1a;任意…

计算机组成原理中7421,计算机组成原理07421

《计算机组成原理07421》由会员分享&#xff0c;可在线阅读&#xff0c;更多相关《计算机组成原理07421(21页珍藏版)》请在技术文库上搜索。1、中断服务子程序图C2.1保存CPU现场设备服务恢复CPU现场开中断&#xff0c;即“中断屏蔽”复位(3)(354)10(542.5)8(4)(354)10(00110101…

1809企业战略管理

客观题 单选题&#xff08;共10题&#xff0c;共20分&#xff09; 1. 石油公司对石油化工企业来而言&#xff0c;决定他们讨价还价能力的最主要影响因素是&#xff08; &#xff09;。 A 交易量 B 产品差异化程度 C 转换成本 D 卖方产品标准化程度 参考答案&#xff1…

矩阵迹(trace), 行列式(determinate)

1. 迹&#xff08;trace&#xff09; 矩阵的迹&#xff08;trace&#xff09;表示矩阵 A AA 主对角线所有元素的和 迹的来源 最根本的应该就是迹和特征值的和相等。因为特征值如此重要&#xff0c;所以才定义了迹。离开了这一点&#xff0c;我觉得迹也就失去了立足点。 迹…

计算机的四个硬盘有什么区别是什么意思,笔记本的内存和硬盘有什么区别 原来笔记本硬盘有这几种...

之前有很多人分不清笔记本的内存和硬盘有何区别&#xff0c;很容易发生“内存128GB”的笑话&#xff0c;那么到底硬盘和内存有和区别?如何判断内存好坏呢?我想你应该看看这篇文章。笔记本内存内存是PC中的重要一环&#xff0c;是数据存放和交换的空间&#xff0c;所以内存容量…

1818国民经济核算

客观题 单选题&#xff08;共30题&#xff0c;共60分&#xff09; 1. 名义持有资产收益表明整个核算期由于&#xff08; &#xff09;变动而引起的全部价值收益。 A 数量 B 综合物价指数 C 时间 D 价格 参考答案&#xff1a;D&#xff1b;考生答案&#xff1a;D&#…

997西方行政学说 (2)

客观题 单项选择题&#xff08;共20题&#xff0c;共20分&#xff09; 1. 行政管理真正形成相对完整的理论体系&#xff0c;成为一门独立学科&#xff0c;是在&#xff08; &#xff09;。 A 17世纪末18世纪初 B 18世纪末19世纪初 C 19世纪末20世纪初 D 20世纪末21世纪…

抖音上发的测体重的软件怎么测试,抖音手机称重是什么软件 怎么用iPhone苹果手机称重方法...

抖音手机称重是最近很流行的&#xff0c;直接将想要称重的东西放在手机上&#xff0c;我们就可以知道物品的重点了&#xff0c;看上去很有意思&#xff0c;很多人都在玩。而抖音手机称重是什么软件呢&#xff1f;文中为大家介绍。抖音手机称重是什么软件称重计&#xff1a;Touc…

最小/大加代数(Min/max-Plus Algebra)

最小加代数 最小加代数最初是用于数字电路、通信网络以及制造工业等离散事件系统( Discrete Event Systems)建模的一种数学工具。在最小加代数中&#xff0c;下面两个运算符经常用到&#xff1a; 最大加代数 https://www.jianshu.com/p/c9847bb31834

1823政府经济学 (2)

客观题 单项选择题&#xff08;共10题&#xff0c;共10分&#xff09; 1. 政府经济的依据主要是&#xff08; &#xff09;。 A 私人财产所有权 B 社会公共权力 C 道德劝说 D 法律制度 参考答案&#xff1a;B&#xff1b;考生答案&#xff1a;B&#xff1b;试题分数&a…

使用Java EE 8中的反应式API加速服务

服务通常可以通过异步处理进行优化&#xff0c;即使不改变其对外界的行为。 某些服务效率不高的原因是&#xff0c;它们需要等待其他服务提供结果才能继续下去。 让我们看一下如何在不等待外部REST服务的情况下调用它们&#xff0c;并独立进行多个并行调用&#xff0c;然后将…

计算机上播放时没声音什么故障,事实:在笔记本电脑上播放歌曲时如果没有声音怎么办...

在笔记本电脑上播放时如果没有声音该怎么办&#xff1f;关于在笔记本电脑上播放时无声音的问题&#xff0c;有些网民仍然不知道该怎么办&#xff0c;所以让我告诉您如何在笔记本电脑上播放无声音时解决问题。希望我能为您服务&#xff01;播放歌曲时&#xff0c;笔记本电脑没有…

martingale、markov chain、Monte Carlo、MCMC

文章结构如下&#xff1a; 1: MCMC 1.1 MCMC是什么 1.2 为什么需要MCMC 2&#xff1a; 蒙特卡罗 2.1 引入 2.2 均匀分布&#xff0c;Box-Muller 变换 2.3 拒绝接受采样&#xff08;Acceptance-Rejection Sampling&#xff09; 2.4 接受拒绝采样的直观解释 2.5 接受拒绝采样方…

1835财务报表分析 (2)

单选题&#xff08;共20题&#xff0c;共60分&#xff09; 1. 下列信息中不属于所有者权益变动表反映的是 A 所有者权益总量的增减变动信息 B 所有者权益增减变动的重要结构性信息 C 直接计入所有者权益的利得和损失 D 企业经营规模和资产结构 参考答案&#xff1a;D&…

1835财务报表分析

单选题&#xff08;共20题&#xff0c;共60分&#xff09; 1. 下列信息中不属于所有者权益变动表反映的是 A 所有者权益总量的增减变动信息 B 所有者权益增减变动的重要结构性信息 C 直接计入所有者权益的利得和损失 D 企业经营规模和资产结构 参考答案&#xff1a;D&…

1849公共部门人力资源管理 (2)

客观题 选择题&#xff08;共20题&#xff0c;共40分&#xff09; 1. &#xff08; &#xff09;的完善程度决定了人力资源流动的规模、质量和效益。 A 人力资源流动政策 B 人力资源供求关系预测 C 人力资源规划 D 人力资源市场 参考答案&#xff1a;D&#xff1b;考…

全面认识Small Cell

发布时间&#xff1a;2013-12-17 作者&#xff1a;申建华&#xff0c;李春旭&#xff0c;谭伟&#xff08;中兴通讯&#xff09;Small Cell是一种低发射功率&#xff0c;小范围覆盖的基站设备。Small Cell作为3G/4G宏蜂窝的补充&#xff0c;能够使运营商以更低的代价为用户提供…

医学计算机ppt模板,计算机与医学.ppt

《计算机与医学.ppt》由会员分享&#xff0c;可在线阅读&#xff0c;更多相关《计算机与医学.ppt(22页珍藏版)》请在人人文库网上搜索。1、计算机与医学,北京大学 信息科学技术学院 2008年9月,2/22,计算机在医学方面能做些什么&#xff1f;,在任何一门学科的研究和实践中&#…

Java“地铁”表(JavaFX)

再次嗨&#xff0c;这次&#xff0c;TableView“ Metro”样式被添加到JMetro JavaFX主题。 这会将JMetro版本放大到3.1.0。 我之所以没有添加表格样式&#xff0c;是因为奇怪的是在Fluent设计系统&#xff08;以前是Metro&#xff09;中还没有表格的定义。 有一个名为DataGrid…

1838公共政策概论

客观题 单选题&#xff08;共20题&#xff0c;共40分&#xff09; 1. 美国学者戴维伊斯顿认为&#xff08; &#xff09; A 公共政策是由政治家&#xff0c;即具有立法权者制定的&#xff0c;而由行政人员执行的法律和法规。 B 公共政策是一种具有目标、价值与策略的大型…