How to Set Reactor. Core. Blockingsinglesubscriber. blockingGet() Timeout

I found my apps CPU using very high(> 200%), and I dump the thread using jstack:

/opt/dabai/tools/jdk1.8.0_211/bin/jstack -F 5307 >> soa-illidan.log

and many thread stack log like is:

 Thread 20247: (state = BLOCKED)
     - sun.misc.Unsafe.park(boolean, long) @bci=0 (Compiled frame; information may be imprecise)
     - java.util.concurrent.locks.LockSupport.park(java.lang.Object) @bci=14, line=175 (Compiled frame)
     - java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt() @bci=1, line=836 (Compiled frame)
     - java.util.concurrent.locks.AbstractQueuedSynchronizer.doAcquireSharedInterruptibly(int) @bci=72, line=997 (Compiled frame)
     - java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireSharedInterruptibly(int) @bci=24, line=1304 (Compiled frame)
     - java.util.concurrent.CountDownLatch.await() @bci=5, line=231 (Compiled frame)
     - reactor.core.publisher.BlockingSingleSubscriber.blockingGet() @bci=48, line=81 (Compiled frame)
     - reactor.core.publisher.Mono.block() @bci=20, line=1494 (Compiled frame)
     - org.springframework.boot.actuate.autoconfigure.health.HealthIndicatorRegistryBeans$ReactiveHealthIndicators.lambda$adapt$1(org.springframework.boot.actuate.health.ReactiveHealthIndicator) @bci=6, line=61 (Compiled frame)
     - org.springframework.boot.actuate.autoconfigure.health.HealthIndicatorRegistryBeans$ReactiveHealthIndicators$$Lambda$538.health() @bci=4 (Compiled frame)
     - org.springframework.boot.actuate.health.CompositeHealthIndicator.health() @bci=63, line=98 (Compiled frame)
     - org.springframework.boot.actuate.health.HealthEndpoint.health() @bci=4, line=50 (Compiled frame)
     - org.springframework.boot.actuate.health.HealthEndpointWebExtension.health(org.springframework.boot.actuate.endpoint.SecurityContext) @bci=8, line=54 (Compiled frame)
     - sun.reflect.GeneratedMethodAccessor198.invoke(java.lang.Object, java.lang.Object[]) @bci=40 (Compiled frame)
     - sun.reflect.DelegatingMethodAccessorImpl.invoke(java.lang.Object, java.lang.Object[]) @bci=6, line=43 (Compiled frame)
     - java.lang.reflect.Method.invoke(java.lang.Object, java.lang.Object[]) @bci=56, line=498 (Compiled frame)
     - org.springframework.util.ReflectionUtils.invokeMethod(java.lang.reflect.Method, java.lang.Object, java.lang.Object[]) @bci=3, line=282 (Compiled frame)
     - org.springframework.boot.actuate.endpoint.invoke.reflect.ReflectiveOperationInvoker.invoke(org.springframework.boot.actuate.endpoint.InvocationContext) @bci=29, line=76 (Compiled frame)
     - org.springframework.boot.actuate.endpoint.annotation.AbstractDiscoveredOperation.invoke(org.springframework.boot.actuate.endpoint.InvocationContext) @bci=5, line=61 (Compiled frame)
     - org.springframework.boot.actuate.endpoint.web.servlet.AbstractWebMvcEndpointHandlerMapping$ServletWebOperationAdapter.handle(javax.servlet.http.HttpServletRequest, java.util.Map) @bci=29, line=294 (Compiled frame)
     - org.springframework.boot.actuate.endpoint.web.servlet.AbstractWebMvcEndpointHandlerMapping$OperationHandler.handle(javax.servlet.http.HttpServletRequest, java.util.Map) @bci=6, line=355 (Compiled frame)
     - sun.reflect.GeneratedMethodAccessor197.invoke(java.lang.Object, java.lang.Object[]) @bci=48 (Compiled frame)
     - sun.reflect.DelegatingMethodAccessorImpl.invoke(java.lang.Object, java.lang.Object[]) @bci=6, line=43 (Compiled frame)
     - java.lang.reflect.Method.invoke(java.lang.Object, java.lang.Object[]) @bci=56, line=498 (Compiled frame)
     - org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(java.lang.Object[]) @bci=16, line=189 (Compiled frame)
     - org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(org.springframework.web.context.request.NativeWebRequest, org.springframework.web.method.support.ModelAndViewContainer, java.lang.Object[]) @bci=56, line=138 (Compiled frame)
     - org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(org.springframework.web.context.request.ServletWebRequest, org.springframework.web.method.support.ModelAndViewContainer, java.lang.Object[]) @bci=4, line=102 (Compiled frame)
     - org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse, org.springframework.web.method.HandlerMethod) @bci=244, line=892 (Compiled frame)
     - org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse, org.springframework.web.method.HandlerMethod) @bci=81, line=797 (Compiled frame)
     - org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse, java.lang.Object) @bci=7, line=87 (Compiled frame)
     - org.springframework.web.servlet.DispatcherServlet.doDispatch(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse) @bci=257, line=1038 (Compiled frame)
     - org.springframework.web.servlet.DispatcherServlet.doService(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse) @bci=212, line=942 (Compiled frame)
     - org.springframework.web.servlet.FrameworkServlet.processRequest(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse) @bci=71, line=1005 (Compiled frame)
     - org.springframework.web.servlet.FrameworkServlet.doGet(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse) @bci=3, line=897 (Compiled frame)
     - javax.servlet.http.HttpServlet.service(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse) @bci=35, line=645 (Compiled frame)
     - org.springframework.web.servlet.FrameworkServlet.service(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse) @bci=33, line=882 (Compiled frame)
     - javax.servlet.http.HttpServlet.service(javax.servlet.ServletRequest, javax.servlet.ServletResponse) @bci=39, line=750 (Compiled frame)
     - org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(javax.servlet.ServletRequest, javax.servlet.ServletResponse) @bci=304, line=231 (Compiled frame)
     - org.apache.catalina.core.ApplicationFilterChain.doFilter(javax.servlet.ServletRequest, javax.servlet.ServletResponse) @bci=101, line=166 (Compiled frame)
     - com.alibaba.druid.support.http.WebStatFilter.doFilter(javax.servlet.ServletRequest, javax.servlet.ServletResponse, javax.servlet.FilterChain) @bci=190, line=123 (Compiled frame)
     - org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(javax.servlet.ServletRequest, javax.servlet.ServletResponse) @bci=135, line=193 (Compiled frame)
     - org.apache.catalina.core.ApplicationFilterChain.doFilter(javax.servlet.ServletRequest, javax.servlet.ServletResponse) @bci=101, line=166 (Compiled frame)
     - org.springframework.boot.actuate.web.trace.servlet.HttpTraceFilter.doFilterInternal(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse, javax.servlet.FilterChain) @bci=49, line=90 (Compiled frame)
     - org.springframework.web.filter.OncePerRequestFilter.doFilter(javax.servlet.ServletRequest, javax.servlet.ServletResponse, javax.servlet.FilterChain) @bci=111, line=107 (Compiled frame)
     - org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(javax.servlet.ServletRequest, javax.servlet.ServletResponse) @bci=135, line=193 (Compiled frame)
     - org.apache.catalina.core.ApplicationFilterChain.doFilter(javax.servlet.ServletRequest, javax.servlet.ServletResponse) @bci=101, line=166 (Compiled frame)
     - org.springframework.web.filter.CorsFilter.doFilterInternal(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse, javax.servlet.FilterChain) @bci=55, line=96 (Compiled frame)
     - org.springframework.web.filter.OncePerRequestFilter.doFilter(javax.servlet.ServletRequest, javax.servlet.ServletResponse, javax.servlet.FilterChain) @bci=111, line=107 (Compiled frame)
     - org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(javax.servlet.ServletRequest, javax.servlet.ServletResponse) @bci=135, line=193 (Compiled frame)
     - org.apache.catalina.core.ApplicationFilterChain.doFilter(javax.servlet.ServletRequest, javax.servlet.ServletResponse) @bci=101, line=166 (Compiled frame)
     - org.springframework.cloud.sleuth.instrument.web.ExceptionLoggingFilter.doFilter(javax.servlet.ServletRequest, javax.servlet.ServletResponse, javax.servlet.FilterChain) @bci=3, line=50 (Compiled frame)
     - org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(javax.servlet.ServletRequest, javax.servlet.ServletResponse) @bci=135, line=193 (Compiled frame)
     - org.apache.catalina.core.ApplicationFilterChain.doFilter(javax.servlet.ServletRequest, javax.servlet.ServletResponse) @bci=101, line=166 (Compiled frame)
     - brave.servlet.TracingFilter.doFilter(javax.servlet.ServletRequest, javax.servlet.ServletResponse, javax.servlet.FilterChain) @bci=148, line=86 (Compiled frame)
     - org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(javax.servlet.ServletRequest, javax.servlet.ServletResponse) @bci=135, line=193 (Compiled frame)
     - org.apache.catalina.core.ApplicationFilterChain.doFilter(javax.servlet.ServletRequest, javax.servlet.ServletResponse) @bci=101, line=166 (Compiled frame)
     - org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter.filterAndRecordMetrics(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse, javax.servlet.FilterChain) @bci=21, line=117 (Compiled frame)
     - org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter.doFilterInternal(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse, javax.servlet.FilterChain) @bci=4, line=106 (Compiled frame)
     - org.springframework.web.filter.OncePerRequestFilter.doFilter(javax.servlet.ServletRequest, javax.servlet.ServletResponse, javax.servlet.FilterChain) @bci=111, line=107 (Compiled frame)
     - org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(javax.servlet.ServletRequest, javax.servlet.ServletResponse) @bci=135, line=193 (Compiled frame)
     - org.apache.catalina.core.ApplicationFilterChain.doFilter(javax.servlet.ServletRequest, javax.servlet.ServletResponse) @bci=101, line=166 (Compiled frame)
     - org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse, javax.servlet.FilterChain) @bci=53, line=200 (Compiled frame)
     - org.springframework.web.filter.OncePerRequestFilter.doFilter(javax.servlet.ServletRequest, javax.servlet.ServletResponse, javax.servlet.FilterChain) @bci=111, line=107 (Compiled frame)
     - org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(javax.servlet.ServletRequest, javax.servlet.ServletResponse) @bci=135, line=193 (Compiled frame)
     - org.apache.catalina.core.ApplicationFilterChain.doFilter(javax.servlet.ServletRequest, javax.servlet.ServletResponse) @bci=101, line=166 (Compiled frame)
     - org.apache.catalina.core.StandardWrapperValve.invoke(org.apache.catalina.connector.Request, org.apache.catalina.connector.Response) @bci=688, line=200 (Compiled frame)
     - org.apache.catalina.core.StandardContextValve.invoke(org.apache.catalina.connector.Request, org.apache.catalina.connector.Response) @bci=166, line=96 (Compiled frame)
     - org.apache.catalina.authenticator.AuthenticatorBase.invoke(org.apache.catalina.connector.Request, org.apache.catalina.connector.Response) @bci=260, line=490 (Compiled frame)
     - org.apache.catalina.core.StandardHostValve.invoke(org.apache.catalina.connector.Request, org.apache.catalina.connector.Response) @bci=114, line=139 (Compiled frame)
     - org.apache.catalina.valves.ErrorReportValve.invoke(org.apache.catalina.connector.Request, org.apache.catalina.connector.Response) @bci=6, line=92 (Compiled frame)
     - org.apache.catalina.core.StandardEngineValve.invoke(org.apache.catalina.connector.Request, org.apache.catalina.connector.Response) @bci=45, line=74 (Compiled frame)
     - org.apache.catalina.connector.CoyoteAdapter.service(org.apache.coyote.Request, org.apache.coyote.Response) @bci=199, line=343 (Compiled frame)
     - org.apache.coyote.http11.Http11Processor.service(org.apache.tomcat.util.net.SocketWrapperBase) @bci=791, line=408 (Compiled frame)
     - org.apache.coyote.AbstractProcessorLight.process(org.apache.tomcat.util.net.SocketWrapperBase, org.apache.tomcat.util.net.SocketEvent) @bci=113, line=66 (Compiled frame)
     - org.apache.coyote.AbstractProtocol$ConnectionHandler.process(org.apache.tomcat.util.net.SocketWrapperBase, org.apache.tomcat.util.net.SocketEvent) @bci=414, line=834 (Compiled frame)
     - org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun() @bci=191, line=1415 (Compiled frame)
     - org.apache.tomcat.util.net.SocketProcessorBase.run() @bci=21, line=49 (Compiled frame)
     - java.util.concurrent.ThreadPoolExecutor.runWorker(java.util.concurrent.ThreadPoolExecutor$Worker) @bci=95, line=1149 (Compiled frame)
     - java.util.concurrent.ThreadPoolExecutor$Worker.run() @bci=5, line=624 (Interpreted frame)
     - org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run() @bci=4, line=61 (Interpreted frame)

 - java.lang.Thread.run() @bci=11, line=748 (Compiled frame)

I read the source code and found maybe the react BlockingSingleSubscriber.blockingGet() method does not give timeout value, but how to config?

1 Answer

Try to implement ReactiveHealthIndicator like this:

@Component
public class MyReactiveHealthIndicator implements ReactiveHealthIndicator {

    @Override
    public Mono<Health> health() {
        return checkDownstreamServiceHealth().onErrorResume(
                ex -> Mono.just(new Health.Builder().down(ex).build())
        );
    }

    private Mono<Health> checkDownstreamServiceHealth() {
        // we could use WebClient to check health reactively
        Health health = new Health.Builder().up().build();
        return Mono.just(health).timeout(Duration.ofSeconds(5));
    }
}

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

Maya Lin-Takahashi

Maya Lin-Takahashi

Consumer Tech & Gadget Reviewer

Maya is a hardware enthusiast who tests and reviews smart home devices, smartphones, wearables, and audio gear. She focuses on practical consumer value and build quality.

Share this article
Twitter Facebook Pinterest