0

我有一个类似的代码片段来调度单独线程池上的 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)
4

0 回答 0