问题描述:Spring Cloud 项目,希望在项目启动的时候通过 feign 调用其他服务,从而初始化一些东西;具体做法是在一个 @Service 类中写一个方法a(),并使用 @PostConstruct 标注方法 a(),在 a() 方法内部,调用 @FeignClient 标注的接口中的方法;结果就出问题了,项目启动的时候会执行 a() 方法,执行 a() 方法的时候就报了 com.netflix.hystrix.exception.HystrixTimeoutException: null
。
经过一番打断点调试,最终发现是调用 @FeignClient 接口的时候,Hystrix 使用的是默认的超时时间(1秒),自己配置的超时时间没有生效。于是就百度,搞来搞去还是不行。
最后就想了想,需求无非是项目启动的时候做一下事情,干嘛非要用 @PostConstruct,换个方法实现需求不就完事了,于是采用实现 CommandLineRunner
接口的方式解决了问题。
备注:要是搞清楚了 @PostConstruct 和 CommandLineRunner 在 spring 中的生命周期的位置,以及 Hystrix 加载配置信息的时机,哪有这些破事。