运行阻塞代码
在完美的世界,将没有战争或饥饿,所有 Api 将使用异步写,阳光明媚,绿色的草地有跳来跳去的兔子和手牵手的小羊羔。
但是,现实世界并不是这样。(你看过新闻最近吗?)
事实是,大多数库,特别是在JVM的生态,Y有许多是同步API,许多的方法有可能阻塞。一个很好的例子是JDBC API - 这是本质上的同步,不管如何努力尝试,Vert.x 不能撒上魔法使之同步。
我们不打算在一夜之间把一切改写成异步,所以我们需要给你提供一个方法,一个Vert.x应用中安全地使用“传统”的阻塞API的方法。
如前所述,直接在事件循环里调用阻塞操作,会妨碍它做任何其他有用的工作。所以你怎么能这样呢?
它是通过调用executeBlocking
指定要执行的阻塞的代码和在执行阻塞的代码时调用返回异步结果处理程序。
通过调用executeblocking
,执行阻塞代码,当阻塞代码执行完成后通过异步回调的方式返回
vertx.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());
});
默认情况下,如果 executeBlocking
从相同的上下文 (例如同一垂直实例) 调用几次不同的 executeBlocking 则以串行方式执行 (即一个接一个)。
默认情况下,如果executeBlocking
在同一环境(例如同一个verticle实例)多次调用,那么不同的executeBlocking
将串行执行(即一个接一个)。
如果不关系执行顺序,调用executeBlocking
时可以制定ordered
参数为false
。在这种情况下 executeBlocking
会与worker pool并行执行。
运行阻塞的代码替代方法是使用worker verticle
worker verticle始终在worker池中的线程执行。