La excepción de Blockhound ocurre incluso con programadores explícitos.
Tengo un fragmento de código similar para programar una entrada/salida en un pool de hilos separado, pero desafortunadamente necesitamos su respuesta para decidir si proceder o no.
private Response getItemsNonBlockingMethod(String id, final String path) {
WebTarget webTarget = sampleServWebTarget
.path(path).queryParam("id", id);
Mono<response> responseMono = Mono.fromCallable(() -> {
// La E/S bloqueante se programa en un pool de hilos separado
return webTarget.request().get();
}).subscribeOn(Schedulers.boundedElastic());
return responseMono.block()
}
He habilitado BlockHound en local, parece estar funcionando bien para la mayoría de los casos. Pero cuando hago pruebas de carga y rendimiento, veo ~10 ocurrencias de excepciones de BlockHound, ¿me estoy perdiendo algo? ¿Hay alguna mejor manera de bloquear en la versión 3.4 de Spring Reactor?
Actualización:
Traza de pila:
reactor.blockhound.BlockingOperationError: ¡Llamada de bloqueo! sun.misc.Unsafe#park
en sun.misc.Unsafe.park(Unsafe.java)
Suprimido: reactor.core.publisher.FluxOnAssembly$OnAssemblyException:
Trazado de ensamblaje del productor [reactor.core.publisher.MonoError]:
reactor.core.publisher.Mono.error
reactor.netty.http.client.HttpClientConnect$HttpClientHandler.requestWithBody(HttpClientConnect.java:559)
El error se ha observado en los siguientes sitios:
|_ Mono.error ⇢ en reactor.netty.http.client.HttpClientConnect$HttpClientHandler.requestWithBody(HttpClientConnect.java:559)
|_ Mono.fromDirect ⇢ en reactor.netty.http.client.HttpClientConnect$HttpIOHandlerObserver.lambda$onStateChange$0(HttpClientConnect.java:398)
|_ Mono.defer ⇢ en reactor.netty.http.client.HttpClientConnect$HttpIOHandlerObserver.onStateChange(HttpClientConnect.java:398)
davy.ai
Parece que estás encontrando un BlockingOperationError al ejecutar pruebas de carga y rendimiento. Esto se debe probablemente a que la llamada de E/S bloqueante se ha programado en un hilo de grupo separado. Para evitarlo, puedes intentar usar una llamada de E/S no bloqueante en su lugar. Además, puedes intentar habilitar BlockHound para detectar y reportar cualquier llamada bloqueante.