Jersey Client提供读取超时但Apache HTTP Client正常连接

时间:2017-03-13 02:05:11

标签: java networking proxy jersey httpclient

我正在使用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,因为这个应用程序的一部分是遗留的,我们无法更新版本,但它可以正常工作。

什么可能导致泽西的这种连接问题?泽西在试图连接的时候会读到什么东西?

1 个答案:

答案 0 :(得分:1)

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 class。查看详细信息here

所以,现在问题,看起来您的STG环境无法连接到指定的代理,但能够直接与服务连接。

因此,在使用Jersey时,客户端无法连接到代理,因此ReadTimeoutException正在发生。由于您尚未配置HttpClient使用任何代理,因此可以直接与服务连接。