Как сделать POST запрос что бы соединение не разрывало минимум 6 часов?

Я тестирую метод который должен работать порядка 5-6 часов. Методу через Post запрос передаются guid. Когда он заканчивает работу записывает данные в БД и возвращает ОК 200. (Очень странное решение, но что есть).

Тестирую я через jmeter + groovy, но тут один запрос и не критично через что его запускать.

Я пытался установить таймауты с помощью:

    connection.setConnectTimeout(6*60*60*1000);
    connection.setReadTimeout(6*60*60*1000);

Но это не работает и соединение отваливается с ошибкой unexpected end of file from server спустя минут 20 (плюс/минус 1 минута). Собственно вопрос в заголовке. В чем может быть дело и как не разрывать соединение часов 6? (а желательно дольше)

import groovy.util.*;
import org.apache.jmeter.services.FileServer
import javax.net.ssl.*
import java.net.*

def nullTrustManager = [
    checkClientTrusted: { chain, authType ->  },
    checkServerTrusted: { chain, authType ->  },
    getAcceptedIssuers: { null }
]

def nullHostnameVerifier = [
    verify: { hostname, session -> true }
]


KeyStore ks = KeyStore.getInstance("JKS");
FileInputStream fis = new FileInputStream("Путь к keystore.keys");
def password = "0000000".toCharArray()
ks.load(fis, password);
KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
kmf.init(ks, password);

ctx = SSLContext.getInstance("TLSv1.2");
ctx.init(kmf.getKeyManagers(), [nullTrustManager as X509TrustManager] as TrustManager[], null);
SSLSocketFactory socketFactory = ctx.getSocketFactory();

def connection
def address = ""

address = "https://someserver.qwe/path/toMethod";

connection = new URL(address).openConnection() as HttpsURLConnection

connection.setConnectTimeout(6*60*60*1000);
connection.setReadTimeout(6*60*60*1000);

connection.setDefaultSSLSocketFactory(ssl_socket_factory);
connection.setDefaultHostnameVerifier(null_host_verifier) as HostnameVerifier)

connection.setDoOutput(true);
connection.setRequestProperty("User-Agent", "jmeter");
connection.setRequestProperty("Content-Type", "application/json; charset=utf8");
connection.setRequestProperty("Accept", "application/json");
SampleResult.setRequestHeaders(connection.getRequestProperties().toString())


def body = """[
    "c6881ad2-a504-49c1-928b-4a1d0a952d14",
    "e9f15af2-a8f3-48c9-97f2-610e1b81b355"
]""";

connection.outputStream.withWriter("utf-8", {
                Writer writer -> writer << body;
})
def response = "";

try{
    if(connection.responseCode < HttpURLConnection.HTTP_BAD_REQUEST){
        SampleResult.setResponseMessage("OK")
        SampleResult.setSuccessful(true)
        response = connection.inputStream.withReader("utf-8", {
            Reader reader -> reader.text
        })
    }else{
        SampleResult.setResponseMessage("Fail")
        SampleResult.setSuccessful(false)
        response = connection.errorStream.withReader("utf-8", {
            Reader reader -> reader.text
        })
    }
}
catch(Exception e){
    log.error "" + e.getMessage() + "\n" + e.getStackTrace();
}

SampleResult.setSamplerData(body)
SampleResult.setResponseCode(connection.responseCode.toString())
SampleResult.setResponseData

Ответы (1 шт):

Автор решения: Dmitri T

Никак.

Судя по тому, что под капотом у Java HTTPClient ошибка Unexpected end of file from server возникает в следующих случаях:

  • потеря соединения (например, пропал интернет)
  • сервер закрывает соединение со своей стороны
  • что-то еще обрывает соединение (роутер, прокси, балансировщик нагрузки и т.д.)

Вы можете попробовать добавить следующую строчку в файл system.properties:

javax.net.debug=all

и посмотреть на запросы и ответы в консоли, но лучше сделать что-то подобное еще и на сервере.

Еще можно попробовать отправить заголовок Connection со значением Keep-Alive

→ Ссылка