您的位置:首页 > 编程语言

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处理
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息