文档章节

使用vertx共享数据 Using Shared Data with Vert.x

天舒
 天舒
发布于 2016/04/19 11:16
字数 1323
阅读 164
收藏 0
点赞 1
评论 0

Using Shared Data with Vert.x

使用vertx共享数据

Shared data contains functionality that allows you to safely share data between different parts of your application, or 

共享数据功能允许你安全的在不同的模块、

different applications in the same Vert.x instance or across a cluster of Vert.x instances.

或不同的应用、或不同的分布式实例之间共享数据。

Shared data includes local shared maps, distributed, cluster-wide maps, asynchronous cluster-wide locks and 

共享数据有多个方式:包括本地共享maps、分布式、宽集群的maps、异步的宽集群锁

asynchronous cluster-wide counters.

、异步的宽集群计数器。

Local shared maps

Local shared maps allow you to share data safely between different event loops (e.g. different verticles) in the same Vert.x instance.

本地共享maps允许你在不同的实例之间共享数据。


Local shared maps only allow certain data types to be used as keys and values. Those types must either be immutable, or certain other types that can be copied like Buffer. In the latter case the key/value will be copied before putting it in the map.

本地存储只允许某些数据类型被设置为keys和values,这个类型必须不可变的或某些可以被拷贝的类型例如Buffer,在最后keys/values被拷贝进map里。

This way we can ensure there is no shared access to mutable state between different threads in your Vert.x application so 

我们可以确定不会有不同线程之间有多个状态。所以

you don’t have to worry about protecting that state by synchronising access to it.

你不用担心异步访问的问题。

Here’s an example of using a shared local map:

这里有个本地共享的例子。

SharedData sd = vertx.sharedData();

LocalMap<String, String> map1 = sd.getLocalMap("mymap1");

map1.put("foo", "bar"); // Strings are immutable so no need to copyLocalMap<String, Buffer> map2 = sd.getLocalMap("mymap2");

map2.put("eek", Buffer.buffer().appendInt(123)); // This buffer will be copied before adding to map// Then... in another part of your application:map1 = sd.getLocalMap("mymap1");

String val = map1.get("foo");

map2 = sd.getLocalMap("mymap2");

Buffer buff = map2.get("eek");

Cluster-wide asynchronous maps

宽集群异步共享maps

Cluster-wide asynchronous maps allow data to be put in the map from any node of the cluster and retrieved from any other node.

宽集群共享map允许从任何集群点、和任何节点上获取共享数据。

This makes them really useful for things like storing session state in a farm of servers hosting a Vert.x web application.

You get an instance of AsyncMap with getClusterWideMap.

这个非常有用,例如存储session状态在一个web应用的集群里。你可以获得一个AsyncMap从getClusterWideMap里。

Getting the map is asynchronous and the result is returned to you in the handler that you specify. Here’s an example:

获取map是异步返回的,你可以单独处理返回结果。

SharedData sd = vertx.sharedData();

sd.<String, String>getClusterWideMap("mymap", res -> {
  if (res.succeeded()) {
    AsyncMap<String, String> map = res.result();
  } else {
    // Something went wrong!
  }
});

Putting data in a map

设置共享数据。

You put data in a map with put.

你可以用put方法设置数据。

The actual put is asynchronous and the handler is notified once it is complete:

事实上put是异步的,hander里会有通知一旦设置完成。

map.put("foo", "bar", resPut -> {
  if (resPut.succeeded()) {
    // Successfully put the value
  } else {
    // Something went wrong!
  }
});

Getting data from a map

获取数据从map里。

You get data from a map with get.

你可以获取数据用get。

The actual get is asynchronous and the handler is notified with the result some time later

实际上获取也是异步的,可以在hander里获取结果。

map.get("foo", resGet -> {
  if (resGet.succeeded()) {
    // Successfully got the value
    Object val = resGet.result();
  } else {
    // Something went wrong!
  }
});

Other map operations

map的其他操作。

You can also remove entries from an asynchronous map, clear them and get the size.

你也可以异步删除、清空map里的实例、和获取map的size。

See the API docs for more information.

查看更多。

Cluster-wide locks

宽集群的锁。

Cluster wide locks allow you to obtain exclusive locks across the cluster - this is useful when you want to do something or access a resource on only one node of a cluster at any one time.

宽集群锁。

Cluster wide locks have an asynchronous API unlike most lock APIs which block the calling thread until the lock is obtained.

宽集群锁有一个异步的方法不像大部分锁的api,它锁的时候会阻止访问线程直到锁成功。

To obtain a lock use getLock.

获取一个锁用getLock。

This won’t block, but when the lock is available, the handler will be called with an instance of Lock, signifying that you now own the lock.

这个不阻止,当锁有效,则handler会被执行,标示着你用了这个锁。

While you own the lock no other caller, anywhere on the cluster will be able to obtain the lock.

When you’ve finished with the lock, you call release to release it, so another caller can obtain it.

sd.getLock("mylock", res -> {
  if (res.succeeded()) {
    // Got the lock!
    Lock lock = res.result();

    // 5 seconds later we release the lock so someone else can get it

    vertx.setTimer(5000, tid -> lock.release());

  } else {
    // Something went wrong
  }
});

You can also get a lock with a timeout. If it fails to obtain the lock within the timeout the handler will be called with a failure:

你可以延时来获取某个锁,如果获取锁超时失败了,会返回一个失败failure。

sd.getLockWithTimeout("mylock", 10000, res -> {
  if (res.succeeded()) {
    // Got the lock!
    Lock lock = res.result();

  } else {
    // Failed to get lock
  }
});

Cluster-wide counters

集群计数器。

It’s often useful to maintain an atomic counter across the different nodes of your application.

如果你经常用一个原子的计数器在不同的节点之间。

You can do this with Counter.

你可以用Counter来做。

You obtain an instance with getCounter:

通过getCounter来获得。

sd.getCounter("mycounter", res -> {
  if (res.succeeded()) {
    Counter counter = res.result();
  } else {
    // Something went wrong!
  }
});

Once you have an instance you can retrieve the current count, atomically increment it, decrement and add a value to it using the various methods.

一旦你获取了一个实例你可以获取当前计数,原子的,可增长,可减少的,可设置的通过各种方法。

See the API docs for more information.


© 著作权归作者所有

共有 人打赏支持
天舒
粉丝 11
博文 14
码字总数 9012
作品 0
东城
架构师
Vert.x入门教程

   Vert.x是一个轻量级的高性能JVM应用平台,基于它可开发各种移动,Web和企业应用程序。一个主要特点是可使用多种语言编写应用,如Java, JavaScript, CoffeeScript, Ruby, Python 或 Gr...

大糊涂 ⋅ 2015/06/20 ⋅ 1

vert.x core vert.x的核心是一个java api的集合

At the heart of Vert.x is a set of Java APIs that we call Vert.x Core vert.x的核心是一个java api的集合 Repository. Vert.x core provides functionality for things like: 核心提供了......

天舒 ⋅ 2016/04/19 ⋅ 0

Vert.X 入门手记 (一) 介绍

Vert.X 中文站:vertx.tk(临时域名) 目前中文化正在进行中,有人来帮忙否?? QQ交流群:219655467 介绍 Vert.X是一个异步网络应用开发框架,用来开发高并发、异步、可伸缩、多语言支持的Web...

Vity ⋅ 2014/03/04 ⋅ 0

Vert.X 入门手记 目录

Vert.X 入门手记 Vert.X 中文站:vertx.tk(临时域名) 目前中文化正在进行中,有人来帮忙否?? QQ交流群:219655467 (一) Vert.X 介绍 (二) Vert.X 下载&安装 (三) Vert.X WebServer (四) V...

Vity ⋅ 2014/03/04 ⋅ 0

使用Vert.x构建Web服务器和消息系统

Vert.x亮点 Vert.x应用程序是事件驱动,异步和单线程的。 Vert.x过程通过事件总线,这是Vert.x的事件驱动架构的内置一块通信。 结合异步处理,单线程组件和事件总线产生高度的可扩展性,并编...

力谱宿云 ⋅ 2016/06/20 ⋅ 0

Vert.x 3.2.0 发布,JVM 上的 Node.js 替代

Vert.x 3.2.0 发布,主要更新如下: mcehref="http://vertx.io/docs/vertx-core/ceylon">vertx-lang-ceylon: the support of the mcehref="http://ceylon-lang.org/">Ceylon language! mceh......

oschina ⋅ 2015/12/16 ⋅ 10

服务共享 vertx Server sharing

Server sharing 服务共享 When several HTTP servers listen on the same port, vert.x orchestrates the request handling using a round-robin strategy. 当几个http服务监听同一个端口,v......

天舒 ⋅ 2016/04/19 ⋅ 0

Vert.x 3.1.0 发布,JVM 上的 Node.js 替代

Vert.x 3.1.0 发布,主要更新内容如下: Vertx-syncis a set of utilities that allow you to perform asynchronous operationsand receive events in a synchronous way, but without bloc......

oschina ⋅ 2015/10/09 ⋅ 12

Vert.x Blueprint 系列教程(二) | 开发基于消息的应用 - Vert.x Kue

Vert.x 蓝图项目已经发布至Vert.x官方网站:Vert.x Blueprint Tutorials 本文章是 Vert.x 蓝图系列 的第二篇教程。全系列: Vert.x Blueprint 系列教程(一) | 待办事项服务开发教程 Vert.x B...

sczyh30 ⋅ 2016/07/26 ⋅ 0

Vert.x 实现REST

欢迎关注http://quanke.name/ 交流群: 转载请注明出处,谢谢 回顾 在第一篇文章中开发了一个非常简单的Vert.x 3应用程序,还包括怎么测试、打包和执行。在第二篇文章中对端口进行了可变配置...

quanke_ ⋅ 2016/01/16 ⋅ 4

没有更多内容

加载失败,请刷新页面

加载更多

下一页

mysql in action / alter table

change character set ALTER SCHEMA `employees` DEFAULT CHARACTER SET utf8mb4 DEFAULT COLLATE utf8mb4_general_ci ;ALTER TABLE `employees`.`t2` CHARACTER SET = utf8mb4 , COLLAT......

qwfys ⋅ 今天 ⋅ 0

Java 开发者不容错过的 12 种高效工具

Java 开发者常常都会想办法如何更快地编写 Java 代码,让编程变得更加轻松。目前,市面上涌现出越来越多的高效编程工具。所以,以下总结了一系列工具列表,其中包含了大多数开发人员已经使用...

jason_kiss ⋅ 昨天 ⋅ 0

Linux下php访问远程ms sqlserver

1、安装freetds(略,安装在/opt/local/freetds 下) 2、cd /path/to/php-5.6.36/ 进入PHP源码目录 3、cd ext/mssql进入MSSQL模块源码目录 4、/opt/php/bin/phpize生成编译配置文件 5、 . ./...

wangxuwei ⋅ 昨天 ⋅ 0

如何成为技术专家

文章来源于 -- 时间的朋友 拥有良好的心态。首先要有空杯心态,用欣赏的眼光发现并学习别人的长处,包括但不限于工具的使用,工作方法,解决问题以及规划未来的能力等。向别人学习的同时要注...

长安一梦 ⋅ 昨天 ⋅ 0

Linux vmstat命令实战详解

vmstat命令是最常见的Linux/Unix监控工具,可以展现给定时间间隔的服务器的状态值,包括服务器的CPU使用率,内存使用,虚拟内存交换情况,IO读写情况。这个命令是我查看Linux/Unix最喜爱的命令...

刘祖鹏 ⋅ 昨天 ⋅ 0

MySQL

查看表相关命令 - 查看表结构    desc 表名- 查看生成表的SQL    show create table 表名- 查看索引    show index from  表名 使用索引和不使用索引 由于索引是专门用于加...

stars永恒 ⋅ 昨天 ⋅ 0

easyui学习笔记

EasyUI常用控件禁用方法 combobox $("#id").combobox({ disabled: true }); ----- $("#id").combobox({ disabled: false}); validatebox $("#id").attr("readonly", true); ----- $("#id").r......

miaojiangmin ⋅ 昨天 ⋅ 0

金山WPS发布了Linux WPS Office

导读 近日,金山WPS发布了Linux WPS Office中文社区版新版本,支持大部分主流Linux系统,功能更加完善,兼容性、稳定性大幅度提升。本次更新WPS将首次在Linux提供专业办公文件云存储服务,实...

问题终结者 ⋅ 昨天 ⋅ 0

springboot2输出metrics到influxdb

序 本文主要研究一下如何将springboot2的metrics输出到influxdb maven <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-bo......

go4it ⋅ 昨天 ⋅ 0

微信小程序 - 选择图片显示操作菜单

之前我分享过选择图片这个文章,但是我在实际开发测试使用中发现一个问题在使用 wx.chooseImage 选择照片显示出第一格是拍照,后面是相册里的图片。这种实现之前说过了,效果如下。 但是你从...

hello_hp ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部