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;任意…

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

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

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

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

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

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

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

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

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

在笔记本电脑上播放时如果没有声音该怎么办&#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 接受拒绝采样方…

Java“地铁”表(JavaFX)

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

razer鼠标测试软件,比HERO更强么,雷蛇FOCUS+引擎蝰蛇V2精准度测试

在鼠标引擎上&#xff0c;罗技HERO曾经一枝独秀&#xff0c;虽然赛睿有TrueMove、冰豹有Owl-Eye夜枭&#xff0c;但都不具备低功耗的特性&#xff0c;只能归类为传统游戏类引擎。作为体量接近罗技的一线品牌&#xff0c;雷蛇成为了一些人期待与之抗衡的希望&#xff0c;在毒蝰/…

rest spring_Spring REST:异常处理卷。 3

rest spring这是该系列中有关Spring REST异常处理的最后一篇文章。 最后&#xff0c;这次我将讨论在表单处理期间可能发生的REST异常的处理。 因此&#xff0c;在本教程中&#xff0c;您将看到与REST&#xff0c;表单和异常处理有关的所有内容。 客户端呢&#xff1f; JQuery将…

计算机季度函数,季度怎么分月份(根据月份函数生成季度)

小伙伴们好&#xff0c;咱们知道&#xff0c;Excel中的日期计算函数非常丰富&#xff0c;有用于计算年份的YEAR函数&#xff0c;有计算月份的MONTH函数&#xff0c;有计算星期的WEEKDAY函数等等。小伙伴们好&#xff0c;咱们知道&#xff0c;Excel中的日期计算函数非常丰富&…

泊松分布和指数分布

一、泊松分布 1.1 泊松分布的定义 日常生活中&#xff0c;大量事件是有固定频率的。 某医院平均每小时出生3个婴儿某公司平均每10分钟接到1个电话某超市平均每天销售4包xx牌奶粉某网站平均每分钟有2次访问 它们的特点就是&#xff0c;我们可以预估这些事件的总数&#xff0…

Gradle多项目构建–类似父pom的结构

当您来自Maven背景时&#xff0c;很可能已经习惯了父pom结构。 现在&#xff0c;在进行gradle时&#xff0c;情况有所不同。 想象一下有一个包含接口和各种其他实现的项目的场景。 这将是我们的项目结构。 multi-project-gradle -- specification -- core -- implementati…

移动办公计算机,最适合移动办公的三款掌上电脑点评

最适合移动办公的三款掌上电脑点评2020-03-31 16:35:554点赞22收藏25评论办公经常使用的是台式电脑或者常规的笔记本&#xff0c;笔记本因其体积较小且轻薄&#xff0c;更适合移动办公&#xff0c;但毕竟十几寸的体积&#xff0c;好几斤的重量&#xff0c;随身携带还是不便&…

正态分布的

正态分布&#xff08;台湾作常态分布&#xff0c;英语&#xff1a;normal distribution&#xff09;又名高斯分布&#xff08;英语&#xff1a;Gaussian distribution&#xff09;&#xff0c;是一个非常常见的连续概率分布。正态分布在统计学上十分重要&#xff0c;经常用在自…

rest spring_Spring REST:异常处理卷。 2

rest spring这是有关使用Spring进行REST异常处理的系列的第二篇文章。 在我以前的文章中&#xff0c;我描述了如何在REST服务中组织最简单的异常处理。 这次&#xff0c;我将更进一步&#xff0c;并向您展示何时最好在ControllerAdvice级别上使用异常处理 。 介绍 在开始本文…

计算机屏幕抖动怎么办,win7屏幕抖动怎么办_win7显示器屏幕抖动的解决方法

电脑使用久了之后难免会出现一些问题&#xff0c;近日就有网友反映说自己的win7旗舰版电脑出现了显示器屏幕抖动的情况&#xff0c;不知道怎么处理这一问题&#xff0c;没关系&#xff0c;下面小编就来为大家分享关于win7显示器屏幕抖动的解决方法。解决方法如下&#xff1a;方…

伯努利分布、二项分布、多项分布、贝塔分布、狄利克雷分布(似然与概率)

瑞士数学家雅克伯努利(Jacques Bernoulli,1654&#xff5e;1705)首次研究独立重复试验(每次成功率为p)。在他去世后的第8年(1713年)&#xff0c;他侄子尼克拉斯出版了伯努利的著作《推测术》。在书中&#xff0c;伯努利指出了如果这样的试验次数足够大&#xff0c;那么成功次数…

网络演算(Networkcalculus)

中文释义 网络演算(Networkcalculus)是一种基于非线性代数的确定性排队理论&#xff0c;目前已广泛应用于计算机网络建模与性能分析&#xff0c;特别是为计算延迟和积压等端到端性能参数的确界提供了有效工具。 网络演算的研究工作可分为理论研究与应用研究。理论研究的研究对…

go语言服务器运行,Go语言实现Web服务器

使用Go语言的库非常容易实现一个Web服务器&#xff0c;用来响应像fetch那样的客户端请求。本节将展示一个迷你服务器&#xff0c;返回访问服务器的URL的路径部分。例如&#xff0c;如果请求的URL是http://localhost:8000/hello&#xff0c;响应将是URL.Path"/hello"。…