我正在使用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,因为这个应用程序的一部分是遗留的,我们无法更新版本,但它可以正常工作。
什么可能导致泽西的这种连接问题?泽西在试图连接的时候会读到什么东西?
答案 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
使用任何代理,因此可以直接与服务连接。