Можно ли настроить okhttp на тайм-аут только в том случае, если в течение последних X секунд не происходило ни чтения, ни записи.
У меня есть случай, когда я sh загружу большой файл или скачаю файл. Однако, большой файл, если время ожидания чтения / записи меньше, чем общее время, необходимое для загрузки / загрузки.
Например:
read timeout = 5 seconds
write timeout = 5 seconds
We upload 100MB every second, and the file to upload is 2GB so it takes 20 seconds to upload.
Это приводит к чтению время ожидания истекает при ожидании чтения, даже если на сервер все еще отправляются байты.
Можно ли выбрасывать исключения тайм-аута, когда ничего не было передано в течение 5 секунд, таким образом, исключение выдается, когда загрузка останавливается.
Вот пример клиента:
OkHttpClient client = new OkHttpClient();
client = client.newBuilder()
.readTimeout(Duration.ofSeconds(1))
.writeTimeout(Duration.ofSeconds(1000000))
.sslSocketFactory(/** conscrypt and trust store set */)
.hostnameVerifier(/** my host name verifier */)
.build();
Request request = new Request.Builder()
.url(serverRoot)
.put(RequestBody.create(new byte[SlowUploadTestServlet.MB_TO_SEND*1024*1024]))
.build();
try (Response response = client.newCall(request).execute()) {
System.out.println(response.body().string());
}
и ответ:
Caused by: java.net.SocketTimeoutException: timeout
at okio.SocketAsyncTimeout.newTimeoutException(Okio.kt:149)
at okio.AsyncTimeout.access$newTimeoutException(AsyncTimeout.kt:162)
at okio.AsyncTimeout$source$1.read(AsyncTimeout.kt:340)
at okio.RealBufferedSource.indexOf(RealBufferedSource.kt:449)
at okio.RealBufferedSource.readUtf8LineStrict(RealBufferedSource.kt:333)
at okio.RealBufferedSource.readUtf8LineStrict(RealBufferedSource.kt:105)
at okhttp3.internal.http1.Http1ExchangeCodec$ChunkedSource.readChunkSize(Http1ExchangeCodec.kt:444)
at okhttp3.internal.http1.Http1ExchangeCodec$ChunkedSource.read(Http1ExchangeCodec.kt:426)
at okhttp3.internal.connection.Exchange$ResponseBodySource.read(Exchange.kt:276)
at okio.Buffer.writeAll(Buffer.kt:1655)
at okio.RealBufferedSource.readString(RealBufferedSource.kt:95)
at okhttp3.ResponseBody.string(ResponseBody.kt:187)
at com.funnelback.api.core.DefaultRestTimeoutIT.lambda$12(DefaultRestTimeoutIT.java:276)
... 25 more
Caused by: java.net.SocketException: socket is closed
at org.conscrypt.ConscryptFileDescriptorSocket$SSLInputStream.read(ConscryptFileDescriptorSocket.java:552)
at okio.InputStreamSource.read(Okio.kt:93)
at okio.AsyncTimeout$source$1.read(AsyncTimeout.kt:129)
... 35 more