Vertx执行阻塞代码
2016-10-24 11:59
274 查看
前提知识
Verticle类型:1. Standard Verticles:会被eventloop线程执行,Verticle内的异步回调Handler也会被同一个eventloop线程来执行,所以同一个Verticle的所有的异步回调Handler会被顺序执行
2. Worker Verticles:会被Worker 线程池中的任意一个线程执行,同时Verticle内的异步回调Handler也会被Worker 线程池中的任意一个线程执行,和Standard Verticles一样,同一个Verticle的所有的异步回调Handler也会被顺序执行,这是由vertx来保证的
3. Multi-threaded worker verticles:会被并发执行的Verticle,不做过多讨论
Vertx执行阻塞代码的方法:
1. 通过worker pool来直接执行:
a,同一个Verticle调用此方法,所有阻塞代码块会被顺序执行,对于操作redis或者db的时候,可以省去事务的事务。
b,阻塞代码块内的回调handler会被注册到Verticle的线程上,而不是worker pool的线程。所以如果是Standard Verticle,阻塞代码块会被worker pool的线程执行,但是阻塞代码块内的回调handler会被Standard Verticle的eventloop线程来执行,有可能造成eventloop阻塞。
c, 所以说用这种写法的话,阻塞代码块内应该都是同步处理,不应该再有异步处理。
WorkerExecutor executor = vertx.createSharedWorkerExecutor("my-worker-pool"); executor.executeBlocking(future -> { // Call some blocking API that takes a significant amount of time to return String result = someAPI.blockingMethod("hello"); future.complete(result); }, res -> { System.out.println("The result is: " + res.result()); });
如果想要并发执行,可以加上false参数
executor.executeBlocking(future->{ }, false, res->{ });
2.通过Worker Verticles来执行:多次调用deploy Worker Verticle的话,是并发执行的
DeploymentOptions options = new DeploymentOptions().setWorker(true); vertx.deployVerticle("com.mycompany.MyOrderProcessorVerticle", options);
一般流程
业务流程通过Standard Verticles来实现,业务流程内的具体处理逻辑交由阻塞代码块执行。比如说eventbus 消息处理系统:
需要注意:
1. 如果executor.executeBlocking用Worker Verticles来替代的话
a,需要考虑并发事务问题
b,deploy和undeploy Worker Verticle需要处理,额外浪费cpu处理
相关文章推荐
- 2014.07.10
- 2014.7.27 Centos+jdk+vertx+ip
- muduo的reactor模式基本实现
- Netty in Action (十七) 第七章节 EventLoop和线程模型
- Javascript Event loop 详解(youtube视频,个人备忘)
- 让java-web应用内嵌类node.js容器:保护资产与已有投入
- 基于JVM的服务端javascript平台Ringo.js入门(三):模块以及包实现
- Vertx简介
- Vertx 生成验证码
- Vertx_web导出excel文档
- javascript运行机制:并发模型 与Event Loop
- Vertx的Redis Client进行事务处理
- Vertx中的verticle详解
- 以vertx为基础的微服务构架下实现requestId的解决思路
- Netty精粹之基于EventLoop机制的高效线程模型
- 多进程 VS 多线程 VS 线程池 VS EventLoop
- 我的第一个Vert.x 3 应用
- Vert.x 应用的配置
- Vert.x 实现REST