我将 Jersey 2.25
客户端与 Jackson
一起使用,我在 Jersey 中正确配置了所有内容,当我在测试类中运行它时,它在我的开发计算机上正常工作,但是Jersey 客户端永远无法连接到部署在 STG 环境中的特定主机,并且总是抛出读取超时异常。
我也知道问题不在我们的环境中,因为我可以使用 curl
进行连接
但是当切换到 HTTPClient 时,它工作正常。
这就是我们创建 Jersey 客户端的方式:
Client client = ClientBuilder.newBuilder()
.register(JacksonFeature.class)
.property(ClientProperties.CONNECT_TIMEOUT,5000)
.property(ClientProperties.READ_TIMEOUT,15000)
.build();
这里唯一的区别是应用程序的流程,而且流程中发生的可能影响连接的主要变化是,在调用 Jersey 客户端之前,另一个类在系统配置中设置了代理:
System.setProperty("http.proxyHost",strProxyHost);
System.setProperty("http.proxyPort",strProxyPort);
System.setProperty("https.proxyHost",strProxyHost);
System.setProperty("https.proxyPort",strProxyPort);
但是我们可以使用HTTPClient正常建立连接:
HttpConnectionManagerParams params = new HttpConnectionManagerParams();
params.setConnectionTimeout(5000);
params.setSoTimeout(10000);
HttpConnectionManager manager = new SimpleHttpConnectionManager();
manager.setParams(params);
HttpClient httpClient = new HttpClient(manager);
我们使用 HTTPClient 3,因为此应用程序的一部分是旧版,我们无法更新版本,但它可以正常工作。
什么可能导致 Jersey 的连接问题? Jersey 在尝试连接时会读取全局信息吗?
最佳答案
Jersey
默认情况下使用 HttpURLConnection
且 HttpURLConnection
使用以下全局设置进行代理配置 -
System.setProperty("http.proxyHost",strProxyHost);
System.setProperty("http.proxyPort",strProxyPort);
System.setProperty("https.proxyHost",strProxyHost);
System.setProperty("https.proxyPort",strProxyPort);
这意味着如果设置了这些系统变量,Jersey 将通过此配置的代理发送所有请求。查看详情here
但是,Apache HttpClient
不遵循这些设置。要在 Apache HttpClient 中使用代理,您必须使用 HostConfiguration 类。查看详情here
现在解决您的问题,您的 STG 环境似乎无法连接到指定的代理,但能够直接连接到服务。
因此,在使用 Jersey 时,客户端无法连接到代理,因此会发生 ReadTimeoutException
。由于您尚未配置 HttpClient
来使用任何代理,因此它可以直接与服务连接。
关于java - Jersey 客户端读取超时,但 Apache HTTP 客户端连接正常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42755566/