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
@PostContructappears to be too early, before the hystrix properties are initialized,this reason is error.Can you try an
@EventListenerinstead?
@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