我位于 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
已弃用。但是我找不到任何可以设置保持活力的新课程