Using blocking handlers

在某些环境下,你也许想要在handler执行时,将event loop阻塞住, 例如调用一个阻塞API或者执行一些密集型计算. 这种情况下,你不能在普通handler中进行操作,我们为route提供了一个阻塞的handler.

阻塞式和非阻塞式handler非常像,只不过阻塞式是由Vert.xworker pool中借出一个线程进行任务执行,而非是从event loop中.

下例进行了说明:

  1. router.route().blockingHandler(routingContext -> {
  2. // Do something that might take some time synchronously
  3. service.doSomethingThatBlocks();
  4. // Now call the next handler
  5. routingContext.next();
  6. });

在默认情况下, Vert.x中任何的阻塞handler都是在相同的上下文中(例如verticle实例中)顺序执行的,这意味着当前一个handler未完成之前,下一个handler是不会执行的. 如果你不关心任务的执行顺序,而且不介意阻塞handler并行执行,你可以在调用blockingHandler方法时传递一个false的参数,让其不按照任务的指定顺序进行执行.