Java Jersey客户端提供读取超时,但Apache HTTP客户端连接正常

Java Jersey客户端提供读取超时,但Apache HTTP客户端连接正常,java,networking,proxy,jersey,httpclient,Java,Networking,Proxy,Jersey,Httpclient,我使用的是Jersey 2.25客户端和Jackson,我在Jersey中正确配置了所有东西,当我在测试类中运行它时,它在我的开发机器上正常工作,但是Jersey客户端永远无法连接到我们在STG环境中部署的特定主机,并且总是抛出读取超时异常 我还知道问题不在我们的环境中,因为我可以使用curl 但当切换到HTTPClient时,它工作正常 这就是我们创建Jersey客户的方式: Client client = ClientBuilder.newBuilder() .reg

我使用的是
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
默认情况下使用
HttpURLConnection
,并且
HttpURLConnection
使用以下全局设置进行代理配置-

System.setProperty("http.proxyHost",strProxyHost);
System.setProperty("http.proxyPort",strProxyPort);
System.setProperty("https.proxyHost",strProxyHost);
System.setProperty("https.proxyPort",strProxyPort);
这意味着,如果设置了这些系统变量,Jersey将通过此配置的代理发送所有请求。查看详细信息

但是,
apachehttpclient
不遵循这些设置。要在
apachehttpclient
中使用代理,必须使用
HostConfiguration类
。查看详细信息

所以,现在来看您的问题,您的STG环境似乎无法连接到指定的代理,但可以直接连接到服务


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

我们可以在任何情况下覆盖它吗?