我有一个类似的代码片段来调度单独线程池上的 I/O,但不幸的是,我们确实需要它的响应来决定是否继续进行。
private Response getItemsNonBlockingMethod(String id, final String path) {
WebTarget webTarget = sampleServWebTarget
.path(path).queryParam("id", id);
Mono<Response> responseMono = Mono.fromCallable(() -> {
// Blocking I/O is scheduled on a separate thread pool
return webTarget.request().get();
}).subscribeOn(Schedulers.boundedElastic());
return responseMono.block()
}
我已经在本地启用了 blockhound,这在大多数情况下似乎都可以正常工作。但是当我进行负载和性能测试时,我确实看到了大约 10 次 blockhound 异常,我错过了什么吗?在 spring reactor 3.4 版中是否有更好的阻塞方法?
更新:
堆栈跟踪:
reactor.blockhound.BlockingOperationError: Blocking call! sun.misc.Unsafe#park
at sun.misc.Unsafe.park(Unsafe.java)
Suppressed: reactor.core.publisher.FluxOnAssembly$OnAssemblyException:
Assembly trace from producer [reactor.core.publisher.MonoError] :
reactor.core.publisher.Mono.error
reactor.netty.http.client.HttpClientConnect$HttpClientHandler.requestWithBody(HttpClientConnect.java:559)
Error has been observed at the following site(s):
|_ Mono.error ⇢ at reactor.netty.http.client.HttpClientConnect$HttpClientHandler.requestWithBody(HttpClientConnect.java:559)
|_ Mono.fromDirect ⇢ at reactor.netty.http.client.HttpClientConnect$HttpIOHandlerObserver.lambda$onStateChange$0(HttpClientConnect.java:398)
|_ Mono.defer ⇢ at reactor.netty.http.client.HttpClientConnect$HttpIOHandlerObserver.onStateChange(HttpClientConnect.java:398)