所以 Micronaut 文档 告诉我们 Micronaut 使用事件循环:
Micronaut 框架基于 Netty 构建,Netty 围绕事件循环模型和非阻塞 I/O 进行设计。 Micronaut 在与请求线程(事件循环线程)相同的线程中执行 @Controller beans 中定义的代码。
并且进一步说
要使用
执行器,只需标记例如:带有blocking
的控制器ExecuteOn
我正在寻找给定注释可能不起作用的原因。我都试过了
@ExecuteOn(TaskExecutors.BLOCKING)
或
@ExecuteOn(TaskExecutors.IO)
但使用的线程仍然是
default-nioEventLoopGroup-2-3
等之一
我有一个阻塞操作要执行,但失败并出现错误
io.micronaut.http.client.exceptions.HttpClientException:您正在尝试在 netty 事件循环线程上运行 BlockingHttpClient 操作。这是错误的常见原因:事件循环永远不应该被阻塞。您可以将控制器标记为 @ExecuteOn(TaskExecutors.BLOCKING),或使用反应式 HTTP 客户端来解决此错误。如果您确定这里的阻塞操作没问题,还有一个配置选项可以禁用此检查。
或者,如果有人知道最后提到的“配置选项”在哪里/什么是禁用检查,那也会很有用。
我也遇到了。原来是因为我使用了暂停功能,例如
@ExecuteOn(TaskExecutors.BLOCKING)
suspend fun greet(): String