我有以下代码:
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
?
非常感谢。
答案 0 :(得分:6)
您尚未包含日志,但我怀疑它们表明被阻止的线程是工作线程。
默认情况下,阻塞的线程检查程序会在事件循环被阻止超过2秒且工作人员超过60秒时发出警告。
这可在VertxOptions
中配置,maxEventLoopExecuteTime
和maxWorkerExecuteTime
。
VertxOptions vertxOptions = new VertxOptions()
.setMaxEventLoopExecuteTime(maxEventLoopExecuteTime)
.setMaxWorkerExecuteTime(maxWorkerExecuteTime);
请注意,这两个值必须以纳秒表示。