I have a timeout issues only on startup and always getting concurrent.Timeout exception. If I disable, only the below hystrix flag then it works fine on startup as well.

Hint: I am calling feignclient in springboot main class as below @PostConstruct public void init() { // Using feignclient }

application.yml

feign: hystrix: enabled: true

hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds: 210000

but we need hystrix also along with feign client.

Exceptions:

2018-11-15 17:41:16.908 INFO 25272 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: 'hiddenHttpMethodFilter' to: [/] 2018-11-15 17:41:16.908 INFO 25272 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: 'httpPutFormContentFilter' to: [/] 2018-11-15 17:41:16.908 INFO 25272 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: 'requestContextFilter' to: [/] 2018-11-15 17:41:16.908 INFO 25272 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: 'webRequestLoggingFilter' to: [/] 2018-11-15 17:41:16.908 INFO 25272 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: 'applicationContextIdFilter' to: [/*] 2018-11-15 17:41:16.997 INFO 25272 --- [ main] s.c.a.AnnotationConfigApplicationContext : Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@2eb917d0: startup date [Thu Nov 15 17:41:16 IST 2018]; parent: org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@71529963 2018-11-15 17:41:17.075 INFO 25272 --- [ main] f.a.AutowiredAnnotationBeanPostProcessor : JSR-330 'javax.inject.Inject' annotation found and supported for autowiring hystrixTO:0 2018-11-15 17:41:17.704 WARN 25272 --- [ main] c.n.c.sources.URLConfigurationSource : No URLs will be polled as dynamic configuration sources. 2018-11-15 17:41:17.704 INFO 25272 --- [ main] c.n.c.sources.URLConfigurationSource : To enable URLs as dynamic configuration sources, define System property archaius.configurationSource.additionalUrls or make config.properties available on classpath. 2018-11-15 17:41:17.719 INFO 25272 --- [ main] c.netflix.config.DynamicPropertyFactory : DynamicPropertyFactory is initialized with configuration sources: com.netflix.config.ConcurrentCompositeConfiguration@4a734c04

om.netflix.hystrix.exception.HystrixRuntimeException: LayerFeignClient#download(String,String) timed-out and no fallback available. at com.netflix.hystrix.AbstractCommand$22.call(AbstractCommand.java:819) at com.netflix.hystrix.AbstractCommand$22.call(AbstractCommand.java:804) at rx.internal.operators.OperatorOnErrorResumeNextViaFunction$4.onError(OperatorOnErrorResumeNextViaFunction.java:140) at rx.internal.operators.OnSubscribeDoOnEach$DoOnEachSubscriber.onError(OnSubscribeDoOnEach.java:87) at rx.internal.operators.OnSubscribeDoOnEach$DoOnEachSubscriber.onError(OnSubscribeDoOnEach.java:87) at com.netflix.hystrix.AbstractCommand$DeprecatedOnFallbackHookApplication$1.onError(AbstractCommand.java:1472) at com.netflix.hystrix.AbstractCommand$FallbackHookApplication$1.onError(AbstractCommand.java:1397) at rx.internal.operators.OnSubscribeDoOnEach$DoOnEachSubscriber.onError(OnSubscribeDoOnEach.java:87) at rx.observers.Subscribers$5.onError(Subscribers.java:230) at rx.internal.operators.OnSubscribeThrow.call(OnSubscribeThrow.java:44) at rx.internal.operators.OnSubscribeThrow.call(OnSubscribeThrow.java:28) at rx.Observable.unsafeSubscribe(Observable.java:10151) at rx.internal.operators.OnSubscribeDefer.call(OnSubscribeDefer.java:51) at rx.internal.operators.OnSubscribeDefer.call(OnSubscribeDefer.java:35) at rx.Observable.unsafeSubscribe(Observable.java:10151) at rx.internal.operators.OnSubscribeDoOnEach.call(OnSubscribeDoOnEach.java:41) at rx.internal.operators.OnSubscribeDoOnEach.call(OnSubscribeDoOnEach.java:30) at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:48) at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:30) at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:48) at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:30) at rx.Observable.unsafeSubscribe(Observable.java:10151) at rx.internal.operators.OnSubscribeDoOnEach.call(OnSubscribeDoOnEach.java:41) at rx.internal.operators.OnSubscribeDoOnEach.call(OnSubscribeDoOnEach.java:30) at rx.Observable.unsafeSubscribe(Observable.java:10151) at rx.internal.operators.OnSubscribeDoOnEach.call(OnSubscribeDoOnEach.java:41) at rx.internal.operators.OnSubscribeDoOnEach.call(OnSubscribeDoOnEach.java:30) at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:48) at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:30) at rx.Observable.unsafeSubscribe(Observable.java:10151) at rx.internal.operators.OnSubscribeDoOnEach.call(OnSubscribeDoOnEach.java:41) at rx.internal.operators.OnSubscribeDoOnEach.call(OnSubscribeDoOnEach.java:30) at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:48) at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:30) at rx.Observable.unsafeSubscribe(Observable.java:10151) at rx.internal.operators.OperatorOnErrorResumeNextViaFunction$4.onError(OperatorOnErrorResumeNextViaFunction.java:142) at rx.internal.operators.OnSubscribeDoOnEach$DoOnEachSubscriber.onError(OnSubscribeDoOnEach.java:87) at rx.internal.operators.OnSubscribeDoOnEach$DoOnEachSubscriber.onError(OnSubscribeDoOnEach.java:87) at com.netflix.hystrix.AbstractCommand$HystrixObservableTimeoutOperator$1$1.run(AbstractCommand.java:1154) at com.netflix.hystrix.strategy.concurrency.HystrixContextRunnable$1.call(HystrixContextRunnable.java:45) at com.netflix.hystrix.strategy.concurrency.HystrixContextRunnable$1.call(HystrixContextRunnable.java:41) at com.netflix.hystrix.strategy.concurrency.HystrixContextRunnable.run(HystrixContextRunnable.java:61) at com.netflix.hystrix.AbstractCommand$HystrixObservableTimeoutOperator$1.tick(AbstractCommand.java:1159) at com.netflix.hystrix.util.HystrixTimer$1.run(HystrixTimer.java:99) at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:308) at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:180) at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:294) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) at java.lang.Thread.run(Thread.java:745) Caused by: java.util.concurrent.TimeoutException at com.netflix.hystrix.AbstractCommand.handleTimeoutViaFallback(AbstractCommand.java:997) at com.netflix.hystrix.AbstractCommand.access$500(AbstractCommand.java:60) at com.netflix.hystrix.AbstractCommand$12.call(AbstractCommand.java:610) at com.netflix.hystrix.AbstractCommand$12.call(AbstractCommand.java:601) at rx.internal.operators.OperatorOnErrorResumeNextViaFunction$4.onError(OperatorOnErrorResumeNextViaFunction.java:140) ... 15 more

Comment From: ryanjbaxter

Please learn how to format code on GitHub.

Maybe provide a sample?

I can imagine startup effecting the timing.

Comment From: Kannadasan89

Thanks you for the quick response. Please find the source code.


FeignClientTestApplication.java

@SpringBootApplication
@EnableFeignClients
@EnableCircuitBreaker
public class FeignClientTestApplication {

    @Autowired
    private VersionInfoFeignClient client;

    public static void main(String[] args) {
        SpringApplication.run(FeignClientTestApplication.class, args);
    }

    @PostConstruct
    public void init() {
        try {
            int versionInfo = client.getServiceVersionInfo(); // Getting java.util.concurrent.TimeoutException exception here
            System.out.println("versionInfo:"+ versionInfo);
        } catch(RuntimeException ex) {
            ex.printStackTrace(); 
        }
    }
}

VersionInfoFeignClient.java

@FeignClient(name = "VersionInfoFeignClient", url = "http://localhost:8080")
public interface VersionInfoFeignClient {

    @GetMapping(path = "/getversioninfo")
    public int getServiceVersionInfo(); 

}

VersionInfoTestController.java

@RestController
public class VersionInfoTestController {

    @Autowired
    private VersionInfoFeignClient client;  

    @GetMapping("/getversioninfo")
    public ResponseEntity<Integer> count() {
        //If i call this endpoint after, service is completely started then it works fine.
        return new ResponseEntity<>(client.getServiceVersionInfo(), HttpStatus.OK);
    }
}
application.yml

feign:
  hystrix:
    enabled: true # If i disable this flag, i can able to get the version properly in init() method

server:
  port: 8090    

hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds: 210000

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.example.demo</groupId>
    <artifactId>feign-client-github</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>feign-client-github</name>
    <description>Demo project for Spring Boot</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.9.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
        <spring-cloud.version>Edgware.SR1</spring-cloud.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-feign</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-hystrix</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-hystrix-dashboard</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>

            <scope>provided</scope>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

Comment From: spencergibb

Provide a sample that we can clone or download, not add comments

Comment From: Kannadasan89

Please find the url to clone or download:-

https://github.com/Kannadasan89/feign-client-hystrix-test

Comment From: ryanjbaxter

@PostContruct appears to be too early, before the hystrix properties are initialized

Can you try an @EventListener instead?

@EventListener
    public void onApplicationEvent(ContextRefreshedEvent event) {
        init();
    }

Comment From: Kannadasan89

I have tried and it works fine with a listeners. And its confirms that hystrix properties is not initialized while calling feign client from Postconstruct method. Thanks for the information.

Comment From: ryanjbaxter

I am going to close this as that seems like a suitable workaround.

Comment From: carl-HelloWorld

Thank you, my issue has been resolved by implementing the SmartInitializingSingleton interface Or the Application Runner OR ApplicationListener

Comment From: carl-HelloWorld

@PostContruct appears to be too early, before the hystrix properties are initialized,this reason is error.

Can you try an @EventListener instead?

@EventListener public void onApplicationEvent(ContextRefreshedEvent event) { init(); }

The real reason,Create response message processing for feignclient, which relies on this. messageConverters. getObject (). getConverter() in SpringDecoder. decode to retrieve all converters in the Spring container. org.springframework.beans.factory.support.AbstractBeanFactory#isTypeMatch(java.lang.String, org.springframework.core.ResolvableType), Will obtain feignclient, feignclient is singletonsCurrentlyInCreation, resulting in inability to obtain lock, waiting for hystrix timeout。

// Thread[main,5,main] org.springframework.beans.factory.support.AbstractBeanFactory#doGetBean // create bean,get bean, acquire lock success Thread[main,5,main]acquire lock success org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(java.lang.String, org.springframework.beans.factory.ObjectFactory<?>) Thread[main,5,main]try acquire lock org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(java.lang.String, boolean) Thread[main,5,main]acquire lock success,org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(java.lang.String, boolean) ................. 2024-08-07 19:37:47.421 INFO 42320 --- [ main] com.netflix.hystrix.AbstractCommand : =============setInvocationStartTime1723030667421 2024-08-07 19:37:47.421 INFO 42320 --- [ hystrix-VersionInfoFeignClient-1,5,main] org.springframework.cloud.netflix.feign.support.SpringDecoder#decode // HttpMessageConverterExtractor<?> extractor = new HttpMessageConverterExtractor(type, this.messageConverters.getObject().getConverters()) Thread[hystrix-VersionInfoFeignClient-1,5,main]try acquire lock org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(java.lang.String, boolean) // wait hystrix timeout 2024-08-07 19:37:57.429 INFO 42320 --- [ HystrixTimer-1] com.netflix.hystrix.AbstractCommand : NOT_EXECUTED============================10000 com.netflix.hystrix.exception.HystrixRuntimeException: VersionInfoFeignClient#getServiceVersionInfo() timed-out and no fallback available. at com.netflix.hystrix.AbstractCommand$22.call(AbstractCommand.java:821) at com.netflix.hystrix.AbstractCommand$22.call(AbstractCommand.java:806) Caused by: java.util.concurrent.TimeoutException at com.netflix.hystrix.AbstractCommand.handleTimeoutViaFallback(AbstractCommand.java:999) at com.netflix.hystrix.AbstractCommand.access$500(AbstractCommand.java:60) at com.netflix.hystrix.AbstractCommand$12.call(AbstractCommand.java:612) at com.netflix.hystrix.AbstractCommand$12.call(AbstractCommand.java:603) at rx.internal.operators.OperatorOnErrorResumeNextViaFunction$4.onError(OperatorOnErrorResumeNextViaFunction.java:140) ... 15 more Thread[main,5,main]org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.afterSingletonCreation // release lock, hystrix thead acquire lock success Thread[hystrix-VersionInfoFeignClient-1,5,main]acquire lock success,org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(java.lang.String, boolean) 2024-08-07 19:37:57.512 INFO 42320 --- [foFeignClient-1] feign.SynchronousMethodHandler : 10075=============feigin response=============1723030677512 2024-08-07 19:37:57.532 WARN 42320 --- [ main] o.s.c.n.a.ArchaiusAutoConfiguration : No spring.application.name found, defaulting to 'application'

@PostConstruct public void init() { try { int versionInfo = client.getServiceVersionInfo(); } catch(RuntimeException ex) { ex.printStackTrace(); } }

my issue has been resolved by implementing the SmartInitializingSingleton interface Or the Application Runner OR ApplicationListener