OKHTTP3 SocketTimeOut только при определенном вызове
У меня есть мобильное приложение, которое выполняет около 15 вызовов API для нашего REST API. Большинство из них - GET, POST, PUT и содержат тело / ответ JSON малого и среднего размера. Мы используем OKHTTP3 3.8.1 .
У нас есть один вызов API Gateway->Lambda, который содержит тело JSON немного большего размера (менее 500 КБ).
Один вызов, поступающий в API Gateway, дает сбой довольно последовательно. Тем не менее, он не работает, только когда мы тестируем на Amazon Kindle Fire 7. Этот вызов работает на Kindle Fire 8, а также на всех других телефонах и планшетах Android, которые мы тестировали.
Я создал другое приложение для проверки этого звонка, используя скопированный код. В тестовом приложении звонок не прерывается. Однако это приложение не выполняет другие наши звонки и не использует BLE или какие-либо другие ресурсы.
При сбое вызова сервер (API-шлюз) вообще не получает запрос (ничего не регистрируется). Поэтому я считаю, что проблема заключается в получении данных с планшета.
Это трассировка стека, которую мы получаем при сбое.
java.net.SocketTimeoutException
at java.net.PlainSocketImpl.read(PlainSocketImpl.java:488)
at java.net.PlainSocketImpl.access$000(PlainSocketImpl.java:37)
at java.net.PlainSocketImpl$PlainSocketInputStream.read(PlainSocketImpl.java:237)
at okio.Okio$2.read(Okio.java:139)
at okio.AsyncTimeout$2.read(AsyncTimeout.java:237)
at okio.RealBufferedSource.indexOf(RealBufferedSource.java:345)
at okio.RealBufferedSource.readUtf8LineStrict(RealBufferedSource.java:217)
at okio.RealBufferedSource.readUtf8LineStrict(RealBufferedSource.java:211)
at okhttp3.internal.http1.Http1Codec.readResponseHeaders(Http1Codec.java:189)
at okhttp3.internal.http.CallServerInterceptor.intercept(CallServerInterceptor.java:75)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:92)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:67)
at com.company.app.helpers.http.HTTPHelpers$LoggingInterceptor.intercept(HTTPHelpers.java:202)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:92)
at okhttp3.internal.connection.ConnectInterceptor.intercept(ConnectInterceptor.java:45)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:92)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:67)
at okhttp3.internal.cache.CacheInterceptor.intercept(CacheInterceptor.java:93)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:92)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:67)
at okhttp3.internal.http.BridgeInterceptor.intercept(BridgeInterceptor.java:93)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:92)
at okhttp3.internal.http.RetryAndFollowUpInterceptor.intercept(RetryAndFollowUpInterceptor.java:120)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:92)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:67)
at com.company.app.helpers.http.HTTPHelpers$HeaderInterceptor.intercept(HTTPHelpers.java:225)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:92)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:67)
at okhttp3.RealCall.getResponseWithInterceptorChain(RealCall.java:185)
at okhttp3.RealCall$AsyncCall.execute(RealCall.java:135)
at okhttp3.internal.NamedRunnable.run(NamedRunnable.java:32)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
at java.lang.Thread.run(Thread.java:818)
Если у кого-то есть идеи о том, почему мы получаем эту ошибку и что может быть исправлением, я был бы очень признателен за любой совет!
Изменить - мы попытались увеличить время ожидания, и звонок все еще не покидает планшет. Мы подтвердили, что звонок не покидает планшет через прокси.
Кроме того, кажется, что проблема связана с использованием BLE одновременно с HTTP.
1 ответ
Попробуйте увеличить время ожидания в охттп
new OkHttpClient.Builder() .connectTimeout(90, TimeUnit.SECONDS).readTimeout(90, TimeUnit.SECONDS) .writeTimeout(90, TimeUnit.SECONDS).build();