在使用Feign Client时,可以通过两种方式来设置超时时间:
- 针对整个Feign Client设置超时时间
可以在Feign Client的配置类中通过修改Request.Options
对象来设置超时时间。Request.Options
对象有两个属性,connectTimeoutMillis
用于设置连接超时时间,readTimeoutMillis
用于设置读取超时时间。
下面是一个示例:
@Configuration
public class FeignClientConfig {@Beanpublic Request.Options requestOptions() {return new Request.Options(5000, 5000);}}
在上面的示例中,连接超时和读取超时时间都设置为5000毫秒。
- 针对单个Feign接口方法设置超时时间
可以在Feign接口方法上使用@FeignClient
注解的configuration
属性来指定一个配置类,然后在配置类中通过修改Request.Options
对象来设置超时时间。
下面是一个示例:
@FeignClient(name = "example-client", configuration = ExampleClientConfig.class)
public interface ExampleClient {@GetMapping("/example")@Headers("Content-Type: application/json")@RequestLine("GET /example")void getExample();}//@Configuration 不能全局配置
public class ExampleClientConfig {@Beanpublic Request.Options requestOptions() {return new Request.Options(5000, 5000);}}
在上面的示例中,ExampleClient
接口中的getExample()
方法的超时时间被配置为5000毫秒。
需要注意的是,Feign Client的超时时间设置只对请求的连接和读取阶段有效,对于响应的处理时间是无效的。如果需要设置整个请求-响应的超时时间,可以通过使用Hystrix
或其他方式来实现。
不生效可能得原因
搜索一下项目里有没有对Options 进行重写,如下所示:
@Beanpublic Options options() {return new Options();}
Options 类
public static class Options {private final int connectTimeoutMillis;private final int readTimeoutMillis;public Options(int connectTimeoutMillis, int readTimeoutMillis) {this.connectTimeoutMillis = connectTimeoutMillis;this.readTimeoutMillis = readTimeoutMillis;}public Options() {this(10000, 60000);}public int connectTimeoutMillis() {return this.connectTimeoutMillis;}public int readTimeoutMillis() {return this.readTimeoutMillis;}}
可以看到Options 类的默认构造函数里connectTimeout为10000ms,readTimeout为60000ms。你的配置文件里面的设置如果不生效可能就是被覆盖了。
feign:client:config:default:connectTimeout: 5000readTimeout: 150000
1.我们需要强制重写它才会生效
@Primary@Beanpublic Request.Options requestOptions(ConfigurableEnvironment env) {String connectTime = env.getProperty("feign.client.config.default.connectTimeout");String readTime = env.getProperty("feign.client.config.default.readTimeout");if (connectTime != null && readTime != null) {Integer connectTimeout = Integer.valueOf(connectTime);Integer readTimeout = Integer.valueOf(readTime);return new Request.Options(connectTimeout, readTimeout);}return new Request.Options();}
2.单独针对某个方法设置超时时间。
@FeignClient(name = "example-client", configuration = ExampleClientConfig.class)
public interface ExampleClient {@GetMapping("/example")@Headers("Content-Type: application/json")@RequestLine("GET /example")void getExample();}@Configuration
public class ExampleClientConfig {@Beanpublic Request.Options requestOptions() {return new Request.Options(5000, 5000);}}