并发主题

Hazelcast入门教程

Hazelcast ( www.hazelcast.com)是一种内存数据网格 in-memory data grid,提供Java程序员关键任务交易和万亿级内存应用。

Hazelcast的集群属于“无主节点”,这意味着它不是一个客户端 - 服务器系统。有一个集群的领导者,默认是最老的成员,管理数据是如何在系统间分布,但是,如果该节点当机,那么是下面一个旧的节点接管。

你所用的数据结构Maps List和队列都是保存在内存中。如果集群中的一个节点死亡,数据不会丢失,但如果多个节点同时当机,那么你就麻烦了。

下面以BigWideWorl为案例说明Hazelcast的使用,首先依赖包导入:

com.hazelcast

hazelcast

3.1

public class BigWideWorld {

private static Random rand = new Random(System.currentTimeMillis());

private final Users users = new Users();

private final int totalNumUsers = users.size();

public String nextUser() {

User user = users.get(rand.nextInt(totalNumUsers));

String name = user.getUsername();

return name;

}

}

nextUser()方法可以随机获得一个用户的名称,用户集合由Users类管理。

public class Users {

/** The users in the database */

private final User[] users = { new User("fred123", "Fred", "Jones", "fredj@a.com"),

new User("jim", "Jim", "Jones", "jimj@a.com"),

new User("bill", "Bill", "Jones", "bill@a.com"),

new User("ted111", "Edward", "Jones", "tedj@a.com"),

new User("annie", "Annette", "Jones", "annj@a.com"),

new User("lucy", "Lucy", "Jones", "lucyj@a.com"),

new User("jimj", "James", "Jones", "jimj@a.com"),

new User("jez", "Jerry", "Jones", "fredj@a.com"),

new User("will", "William", "Jones", "willj@a.com"),

new User("shaz", "Sharon", "Jones", "shazj@a.com"),

new User("paula", "Paula", "Jones", "pauj@a.com"),

new User("leo", "Leonardo", "Jones", "leoj@a.com"), };

private final Map userMap;

public Users() {

userMap = new HashMap();

for (User user : users) {

userMap.put(user.getUsername(), user);

}

}

/**

* The number of users in the database

*/

public int size() {

return userMap.size();

}

/**

* Given a number, return the user

*/

public User get(int index) {

return users[index];

}

/**

* Given the user's name return the User details

*/

public User get(String username) {

return userMap.get(username);

}

/**

* Return the user names.

*/

public Set getUserNames() {

return userMap.keySet();

}

}

Users其实类似一个Map集合。下面是用户类:

public class User implements Serializable {

private static final long serialVersionUID = 1L;

private final String username;

private final String firstName;

private final String lastName;

private final String email;

public User(String username, String firstName, String lastName, String email) {

super();

this.username = username;

this.firstName = firstName;

this.lastName = lastName;

this.email = email;

}

public String getUsername() {

return username;

}

public String getFirstName() {

return firstName;

}

public String getLastName() {

return lastName;

}

public String getEmail() {

return email;

}

@Override

public String toString() {

StringBuilder sb = new StringBuilder("User: ");

sb.append(username);

sb.append(" ");

sb.append(firstName);

sb.append(" ");

sb.append(lastName);

sb.append(" ");

sb.append(email);

return sb.toString();

}

}

用户User必须实现序列化接口。

客户端调用代码如下:

public class Main {

public static void main(String[] args) throws InterruptedException {

BigWideWorld theWorld = new BigWideWorld();

MyApplication application = new MyApplication();

while (true) {

String username = theWorld.nextUser();

if (application.isLoggedOn(username)) {

application.logout(username);

} else {

application.logon(username);

}

application.displayUsers();

TimeUnit.SECONDS.sleep(2);

}

}

}

此代码创建BigWideWorld和所有MyApplication的实例。然后,它无限循环抓住抓取下一个随机的用户名。如果是已经登录的用户,那么注销该用户。如果没有登录的用户,然后登录用户后显示。

运行该代码:

java -cp /your path to the/hazelcast-3.1/lib/hazelcast-1.jar:. com.captaindebug.hazelcast.gettingstarted.Main

得到如下结果:

Logged on users:

User: fred123 Fred Jones fredj@a.com

User: jimj James Jones jimj@a.com

User: shaz Sharon Jones shazj@a.com

User: paula Paula Jones pauj@a.com

User: lucy Lucy Jones lucyj@a.com

User: jez Jerry Jones fredj@a.com

User: jim Jim Jones jimj@a.com

7 -- 14:54:16-17

可以多开几个终端运行这个代码。

你会看到用户不断在登录推出,用户Map集合每次显示出改变,关键是:一个应用的Map大小变化会影响其他窗口应用内的大小,好像大家共用一个Users的Map集合。

发布者和订阅者实现

假设有一个模型:

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();

}

}

要求将股票的买入卖出价格在任何时间发布给做市商。

发布者代码:

public class MarketMaker implements Runnable {

private static Random random = new Random();

private final String stockCode;

private final String description;

private final ITopic 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 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();

}

}

其中代码关键是:

ITopic createTopic(String topicName) {

HazelcastInstance hzInstance = Hazelcast.newHazelcastInstance();

return hzInstance.getTopic(topicName);

}

这是设置Hazelcast,创建一个主题topic用于股票发布。真正发布是在run方法中的topic.publish(price);

订阅者代码如下:

public class Client implements MessageListener {

public Client(String topicName) {

HazelcastInstance hzInstance = Hazelcast.newHazelcastInstance();

ITopic topic = hzInstance.getTopic(topicName);

topic.addMessageListener(this);

}

/**

* @see com.hazelcast.core.MessageListener#onMessage(com.hazelcast.core.Message)

*/

@Override

public void onMessage(Message arg0) {

System.out.println("Received: " + arg0.getMessageObject().toString());

}

public static void main(String[] args) {

new Client("STOCKS");

}

}

下面是运行,需要配合两个包:hazel cast-3.1.jar and guava-13.0.1.jar.

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

本案例源码下载 github

hazelcast java_Hazelcast入门教程相关推荐

  1. hazelcast入门教程_Hazelcast入门指南第7部分

    hazelcast入门教程 这是解释如何使用Hazelcast的系列文章的续篇. 如果一个人没有阅读其他六个帖子,请转到目录并阅读其他帖子. 不同的地图种类 Hazelcast的MultiMap打破了 ...

  2. hazelcast入门教程_Hazelcast入门指南第6部分

    hazelcast入门教程 这是有关Hazelcast的一系列文章中的第六篇. 如果一个人没有看过过去的五年,请到表中的内容后 ,我创建赶上. 本地客户 在上一篇文章之后,我决定要去本地化. 是的,我 ...

  3. hazelcast入门教程_Hazelcast入门指南第5部分

    hazelcast入门教程 这是我撰写的有关Hazelcast的一系列文章的延续. 我强烈建议您阅读其他内容: 第1 部分 , 第2 部分 , 第3 部分和第4部分 . 一气呵成的东西 这篇文章中没有 ...

  4. hazelcast入门教程_Hazelcast入门指南第2部分

    hazelcast入门教程 本文是我开始使用Hazelcast (分布式内存数据库)的系列文章的继续. 如果尚未阅读第一篇文章,请单击此处 . 分布式馆藏 Hazelcast具有许多可用于存储数据的分 ...

  5. hazelcast入门教程_Hazelcast入门指南第4部分

    hazelcast入门教程 这是我的Hazelcast系列的第四部分. 如果一个人没有看到其他三个人,我建议一个人去看第1 部分 , 第2 部分和第3部分 . 记录中 日志记录是任何应用程序的重要功能 ...

  6. hazelcast入门教程_Hazelcast入门指南第3部分

    hazelcast入门教程 这是从初学者的角度来看一系列有关如何使用Hazelcast的文章的延续. 如果您还没有阅读最后两个,我鼓励阅读它们: Hazelcast入门指南第1部分 Hazelcast ...

  7. hazelcast 搭建_hazelcast教程 入门

    hazelcast教程-入门 最近一直在研究hazelcast,被hazelcast简单的API操作和丰富的功能所震撼,但是困于中文文档的匮乏,所以想要编写一些关于hazelcast的一些教程文档,想 ...

  8. hazelcast入门教程_Hazelcast入门

    hazelcast入门教程 7月,我写了一个博客向Java开发人员介绍erlang,重点介绍了这两种语言之间的一些异同. erlang虚拟机具有许多令人印象深刻的内置功能,其中之一是它们独立于位置且可 ...

  9. SpringBoot入门教程(转)

    SpringBoot入门教程 注:此文章转载于GitHub,但是原文章图片加载出错,因此我整理了一下,并非本人原创,在此感谢原作者! 附上原文视频课地址供大家学习: www.bilibili.com/ ...

最新文章

  1. shell单例-处理方案
  2. chapter_2 索引优先队列
  3. The Tower(HDU6559+2018年吉林站+数学)
  4. mybatis-plus 错误java.lang.NoClassDefFoundError: org
  5. Acwing第 29 场周赛【完结】
  6. 限制EditText 输入的字节数
  7. 基于.net standard 的动态编译实现
  8. jmeter 插件 监视器 图形界面使用
  9. 快速迁移 Next.js 应用到函数计算
  10. loadView 和 viewDidLoad、viewDidunload 的区别
  11. redis练习-模拟手机验证码的发送
  12. List集合之CopyOnWriteArrayList
  13. bigemap 软件功能对比
  14. 婚姻是一场精神上的门当户对
  15. 常用的集成TTL门电路
  16. 【软件介绍】IGV软件的安装和基本介绍
  17. 记录win10安装Dexdump并脱壳
  18. 农历天干地支算法源代码大全(javascript、vbscript、C#、flash、C++、C等等)
  19. 模拟CMOS集成电路设计入门学习(10)
  20. OpenCV-Python计算机视觉开发利器

热门文章

  1. python plt pyplot matplotlib绘图时形状异常
  2. 英语 动画 教学 字母_字母形式在阅读教学中的作用
  3. Ubuntu添加和设置默认中文字体
  4. OKR-VUCA时代目标管理利器实践分享
  5. 苹果手机微信记录恢复最简单的恢复方法
  6. EMW3031下模拟I2C实现
  7. 试图加载格式不正确的程序 解决方法
  8. AndroidStudio 实现用户登录注册
  9. chmod u+s权限理解
  10. mac无法连接手机进行调试解决方法