Verticle

  • 一个verticle是部署在Vert.x.单位 每个verticle包含启动它的主要手段。 一个应用程序可以是单个verticle或者可以由与彼此经由事件总线通信的多个verticles的。

  • Verticles在Vert.x实例中运行。 每个Vert.x实例在其自己的JVM实例运行,并且可以承载多个verticles。 一个Vert.x实例确保verticles彼此通过运行每个在其自己的类加载器分离,所以没有修改一个静态变量是另一个实例的风险。 主机可以运行一个单一的Vert.x实例或多个的。

  • 一个Vert.x实例,保证每个verticle实例总是在同一个线程执行。 并发Vert.x 是单线程的。

  • 在内部,Vert.x实例维护一组线程(通常为CPU核心数)是在执行一个事件循环 :检查,看看是否有工作要做,做到这一点,去睡觉。

  • Verticles通过使用事件总线传递消息通信。

  • 虽然你可能会认为,共享数据和可扩展性截然相反。 Vert.x提供了一个共享的MAP和跨在同一Vert.x实例中运行verticles传递不可改变的数据共享一套设施,这时候数据是可变的唯一真正的 。

  • Vert.x使用相对较少的线程来创建一个事件循环和执行verticles。 但在某些情况下,需要verticle做一些要么昂贵计算,或可能阻塞,如连接到数据库。 当发生这种情况Vert.x可以让你标记verticle实例作为worker verticle 。Vert.x确保worker verticles将永远不会被同时执行,所以要他们保持在最低水平,但他们在那里帮助你,当你需要他们,在这种情况下,将由后台执行的线程池执行。

Verticle

1,标准Verticle

这是最常见的一种,它是由一个event loop 线程来执行。它被创建的时候分分配到一个event loop线程,并使用这个线程调用它的start方法。它保证在这个实例中执行的代码都是在同一个event loop线程中执行。

2,Worker Verticles

它使用worker 线程池中的一个线程执行,一个实例自始至终都是使用同一个线程执行。类似于标准Verticles,但是使用的是worker 线程池,它一般用来执行那些有阻塞的代码,比如网络请求,数据库请求,文件创建等等,这样它就不会阻塞event loop线程了。可以像下面这样创建一个worker Verticles

DeploymentOptions options = new DeploymentOptions().setWorker(true);
vertx.deployVerticle("com.mycompany.MyOrderProcessorVerticle", options);

3,多线程Worker Verticles

它也是使用wroker线程池中的一个线程执行,一个实现可以使用多个线程同时执行。它需要用户自己保证每个Verticles的并发安全性。Vertx的客户端和服务端不能在这里面创建,要不然它会抛出一个异常。

部署一个Verticles

Verticle myVerticle = new MyVerticle();
vertx.deployVerticle(myVerticle);

使用Json传入配置

JsonObject config = new JsonObject().put("name", "tim").put("directory", "/blah");
DeploymentOptions options = new DeploymentOptions().setConfig(config);
vertx.deployVerticle("com.mycompany.MyOrderProcessorVerticle", options);

Context 

获取Context

Context context = vertx.getOrCreateContext();

判断Context的类型

Context context = vertx.getOrCreateContext();
if (context.isEventLoopContext()) {
System.out.println("Context attached to Event Loop");
} else if (context.isWorkerContext()) {
System.out.println("Context attached to Worker Thread");
} else if (context.isMultiThreadedWorkerContext()) {
System.out.println("Context attached to Worker Thread - multi threaded worker");
} else if (! Context.isOnVertxThread()) {
System.out.println("Context not attached to a thread managed by vert.x");
}

Context中加入共享数据

final Context context = vertx.getOrCreateContext();
context.put("data", "hello");
context.runOnContext((v) -> {
String hello = context.get("data");
});

定时

执行一次

long timerID = vertx.setTimer(1000, id -> {
System.out.println("And one second later this is printed");
}); System.out.println("First this is printed");

执行多次

long timerID = vertx.setPeriodic(1000, id -> {
System.out.println("And every second this is printed");
}); System.out.println("First this is printed");

在执行多次任务时,如果间隔时间太短,而任务执行的时间又太长,并不会阻止定时器的运行。建议可以使用执行一次,成功之后再添加执行一次。

Event Bus

它是整个系统的神经网络,用于不同模块数据之间的交互,有publish/subscribe, point-to-point, and request-response messaging.

如果发送消息之后希望接收返回消息,可以使用下面的方式:

发送者:

eventBus.send("news.uk.sport", "Yay! Someone kicked a ball across a patch of grass", ar -> {
if (ar.succeeded()) {
System.out.println("Received reply: " + ar.result().body());
}
});

接收者:

MessageConsumer<String> consumer = eventBus.consumer("news.uk.sport");
consumer.handler(message -> {
System.out.println("I have received a message: " + message.body());
message.reply("how interesting!");
});

最新文章

  1. 版本控制-Git服务器搭建和常用命令使用
  2. [Swift] 疑难杂症
  3. redis 库相关命令
  4. Android Studio介绍
  5. uc_client是如何与UCenter进行通信的
  6. wp7 BaseDictionary&lt;TKey, TValue&gt;
  7. Django RequestContext用法
  8. JSP的设计模式
  9. ZJOI2006物流运输
  10. 浅谈OC运行时(RunTime)
  11. POJ 2002 Squares 哈希
  12. IPCS资源
  13. eclipse 错误: 找不到或无法加载主类
  14. PHP打开PDO_MySQL扩展的配置方法
  15. GridView中日期显示格式
  16. php人员权限管理(RBAC)
  17. text-decoration、text-decoration-color、text-decoration-line、text-decoration-style属性
  18. 【JVM.6】虚拟机类加载机制
  19. 通过ambari安装hadoop集群,ZT
  20. 【转】微信公众号h5网页被嵌入广告 不知道什么原因

热门文章

  1. Python数据分析基础教程
  2. 网易im即时通讯 移动端嵌入web
  3. 201771010118《面向对象程序设计(java)》第四周学习总结
  4. python全栈开发 * background 定位 z-index * 180813
  5. java课程设计团队博客《基于学院的搜索引擎》
  6. 创建zookeeper集群
  7. 电子产品使用感受之----AirPods的一天使用体验分享
  8. django创建命令及配置
  9. 自学stm32就要记住入了这个“大坑”要耐得住寂寞
  10. python摸爬滚打之day28----黏包处理