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)

Если у кого-то есть идеи о том, почему мы получаем эту ошибку и что, возможно, можно исправить, я был бы очень признателен за любой совет!

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

Кроме того, похоже, что проблема связана с использованием BLE одновременно с HTTP.


person Daniel Litvak    schedule 06.09.2017    source источник


Ответы (1)


Попробуйте увеличить время ожидания в okhttp

new OkHttpClient.Builder() .connectTimeout(90, TimeUnit.SECONDS).readTimeout(90, TimeUnit.SECONDS) .writeTimeout(90, TimeUnit.SECONDS).build();
person vikas kumar    schedule 06.09.2017
comment
Мы увеличили таймаут и звонок не уходит с планшета. - person Daniel Litvak; 06.09.2017