【发布时间】:2018-11-19 13:00:21
【问题描述】:
位于 AWS 私有子网中的 Java 应用程序通过 AWS Nat 网关连接到 http 服务器。我通过HttpClient 向HTTP 服务器调用POST 请求。该请求将需要 10 多分钟才能完成。我已经配置了 1 小时的套接字超时和连接超时,因为这是一个后台任务。但是中间 AWS NAT 网关将在 300 秒 [5 分钟] 后发回 RST 数据包并导致连接重置,我无法增加 NAT 网关超时。所以我需要从我的应用程序端处理问题。
我的策略是使用 TCP 保持活动时间,它将每 240 秒发送一个数据包以保持连接处于活动状态。我已经配置了这个 如下
CloseableHttpClient httpClient = HttpClients.createDefault()
HttpParams params = httpClient.getParams();
HttpConnectionParams.setConnectionTimeout(params, 3600000); //connection Timeout
HttpConnectionParams.setSoTimeout(params, 3600000); // Socket Time out
HttpConnectionParams.setSoKeepalive(params, true); //Enable Socket level keep alive time
然后通过execute方法调用post请求
HttpPost post = new HttpPost("http://url");
HttpResponse response = httpClient.execute(post);
由于我使用的是 Linux 系统,因此我使用以下 sysctl 值配置了服务器:
sysctl -w net.ipv4.tcp_keepalive_time=240
sysctl -w net.ipv4.tcp_keepalive_intvl=240
sysctl -w net.ipv4.tcp_keepalive_probes=10
但是在执行程序时,没有启用保持活动,并且连接失败。
我已经使用 netstat -o 选项检查了这一点,如下所示保持活动已关闭
tcp 0 0 192.168.1.141:43770 public_ip:80 ESTABLISHED 18134/java off (0.00/0/0)
有什么方法可以让我使用 httpclient 从 java 代码中设置 TCP 保持活动状态。我还可以看到 HttpConnectionParams 已被弃用。但是我找不到任何可以设置keep alive的新类
【问题讨论】:
-
是的,我已经仔细检查过了。 http 服务器的超时时间也是 1 小时。这是导致问题的NAT网关。我已经通过 curl 尝试了相同的 post call,并且请求成功的超时时间小于 300 秒。如果我给出的超时时间大于 300,它就会失败。此外,当我们不使用 NAT 网关时,请求也会成功。
标签: java apache-httpclient-4.x tcp-keepalive