Мое java-приложение, которое находится в частной подсети AWS, подключается к http-серверу через шлюз AWS Nat. Я вызываю запрос POST через httpclient к серверу HTTP. Этот запрос займет более 10 минут. Я настроил время ожидания сокета и время соединения 1 час, так как это фоновая задача. Но промежуточный шлюз AWS NAT отправит обратно пакет RST через 300 секунд [5 минут] и приведет к сбросу соединения, поэтому я не могу увеличить время ожидания шлюза 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
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 и, как показано ниже, keep alive выключен
tcp 0 0 192.168.1.141:43770 public_ip:80 ESTABLISHED 18134/java off (0.00/0/0)
Есть ли какой-нибудь способ, которым я могу установить поддержку TCP по Java-коду, используя httpclient. Также я вижу, что HttpConnectionParams устарели. Но я не смог найти ни одного нового класса, который мог бы поддерживать жизнь
Спасибо