Vertx在executeBlocking期间阻止了线程异常

时间:2018-01-31 04:18:38

标签: java multithreading vert.x

我有以下代码:

vertx.executeBlocking( future -> {
    // do something that takes more than 60 seconds
    future.complete();
}, result -> {
    // handle the result
});

如果executeBlocking内的代码需要超过60秒来评估,那么BlockedThreadChecker会在日志中开始打印关于阻止主事件线程的异常。在我不使用executeBlocking的情况下,警告 - 如预期的那样 - 仅在2秒后打印。

我知道有一些方法可以完全禁用BlockedThreadChecker日志消息,但我希望保留它们,因为我希望在阻止事件线程时收到通知。

executeBlocking中的代码是否实际阻止了主事件线程?如果是,那么现在我是否执行长时间运行的任务而不阻止它?如果不是,那么为什么要记录这些消息以及如何禁用它们(不完全禁用BlockedThreadChecker

非常感谢。

1 个答案:

答案 0 :(得分:6)

您尚未包含日志,但我怀疑它们表明被阻止的线程是工作线程。

默认情况下,阻塞的线程检查程序会在事件循环被阻止超过2秒且工作人员超过60秒时发出警告。

这可在VertxOptions中配置,maxEventLoopExecuteTimemaxWorkerExecuteTime

VertxOptions vertxOptions = new VertxOptions()
  .setMaxEventLoopExecuteTime(maxEventLoopExecuteTime)
  .setMaxWorkerExecuteTime(maxWorkerExecuteTime);

请注意,这两个值必须以纳秒表示。