Spring应用配置外部系统请求超时的可行方案咨询
解决Jersey 2.x客户端超时配置不生效的问题
我之前也碰到过一模一样的情况,你尝试的方案没生效,大概率是配置超时的时机错了——Jersey 2.x的Client实例是不可变的,必须在调用clientBuilder.build()之前设置超时属性,而不是构建完Client之后再去修改。
正确的配置步骤
首先确保导入org.glassfish.jersey.client.ClientProperties这个类,然后在构建Client之前,直接通过clientBuilder设置超时属性:
// 配置连接超时(TCP握手阶段的超时,单位毫秒) clientBuilder.property(ClientProperties.CONNECT_TIMEOUT, 5000); // 配置读取超时(等待服务器响应数据的超时,单位毫秒) clientBuilder.property(ClientProperties.READ_TIMEOUT, 10000); // 先配置超时,再构建Client实例 Client client = clientBuilder.build(); WebTarget target = client.target(baseUrl) .register(jsonProvider) .register(jsonAcceptHeaderClientRequestFilter) .register(new LoggingFilter());
属性说明
CONNECT_TIMEOUT:控制建立TCP连接的最长等待时间,超时会抛出SocketTimeoutExceptionREAD_TIMEOUT:控制客户端等待服务器返回响应数据的最长时间,超时同样会触发超时异常
如果你使用自定义连接器(比如Apache HttpClient)
如果你的项目用了Apache HttpClient作为Jersey的底层连接器,需要通过对应的配置类来设置:
ApacheClientConfig apacheConfig = new ApacheClientConfig(); apacheConfig.getProperties().put(ClientProperties.CONNECT_TIMEOUT, 5000); apacheConfig.getProperties().put(ClientProperties.READ_TIMEOUT, 10000); Client client = ClientBuilder.newClient(apacheConfig);
验证方法
你可以故意让外部服务延迟响应(比如用调试工具模拟),或者把baseUrl改成一个不可达的地址,看是否会在设置的超时时间后抛出javax.ws.rs.ProcessingException(内部包裹SocketTimeoutException),以此验证配置是否生效。
内容的提问来源于stack exchange,提问作者Stefan
相关产品推荐
相关产品推荐

