Vertx执行阻塞代码

前提知识

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 消息处理系统:
Vertx执行阻塞代码_第1张图片

需要注意:
1. 如果executor.executeBlocking用Worker Verticles来替代的话
a,需要考虑并发事务问题
b,deploy和undeploy Worker Verticle需要处理,额外浪费cpu处理

你可能感兴趣的:(Vert.x)