Как сделать 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 шт):
Никак.
Судя по тому, что под капотом у Java HTTPClient ошибка Unexpected end of file from server возникает в следующих случаях:
- потеря соединения (например, пропал интернет)
- сервер закрывает соединение со своей стороны
- что-то еще обрывает соединение (роутер, прокси, балансировщик нагрузки и т.д.)
Вы можете попробовать добавить следующую строчку в файл system.properties:
javax.net.debug=all
и посмотреть на запросы и ответы в консоли, но лучше сделать что-то подобное еще и на сервере.
Еще можно попробовать отправить заголовок Connection со значением Keep-Alive