java - Jersey 客户端读取超时,但 Apache HTTP 客户端连接正常

标签 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,因为此应用程序的一部分是旧版,我们无法更新版本,但它可以正常工作。

什么可能导致 Jersey 的连接问题? Jersey 在尝试连接时会读取全局信息吗?

最佳答案

Jersey 默认情况下使用 HttpURLConnectionHttpURLConnection 使用以下全局设置进行代理配置 -

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/

相关文章:

Python - 确定ip是否是代理

nginx - 使用 “nginx-proxy” docker容器配置的目标网站上的网关错误

java - 在Java中,条件表达式是线程安全操作吗?

java - 带有文本/html 响应的响应式(Reactive) WebClient GET 请求

java - 使用 Chronicle Map 作为微服务之间数据共享的手段

ios - NSStream - 反向 DNS 查找错误

java - OSGi 容器何时开始使用运行时添加的更新版本包的导出?

java - 列出 LAN 上所有计算机的名称或 IP

sockets - TCP端口复制器

reactjs - 在 React/Express 应用程序的生产环境中代理 API 请求