2017-09-06 6 views
0

Ich habe eine mobile App, die ungefähr 15 API-Aufrufe an unsere REST-API sendet. Die meisten davon sind GET, POST, PUT und enthalten kleine bis mittlere JSON-Körper/Antwort. Wir verwenden OKHTTP3 3.8.1.OKHTTP3 SocketTimeOut nur bei bestimmten Anrufen

Wir haben einen Aufruf an API Gateway-> Lambda, der einen etwas größeren JSON-Körper (weniger als 500kb) enthält.

Der eine Anruf, der an das API-Gateway gesendet wird, ist ziemlich konsistent. Es schlägt jedoch nur fehl, wenn wir auf einem Amazon Kindle Fire 7 testen. Der Anruf funktioniert auf Kindle Fire 8, sowie alle anderen Android-Telefone/Tablets, die wir getestet haben.

Ich habe eine andere App erstellt, um diesen Anruf mit kopierten Code zu testen. In der Test-App schlägt der Anruf nicht fehl. Diese App führt jedoch keine anderen Anrufe durch und verwendet keine BLE oder andere Ressourcen.

Wenn der Aufruf fehlschlägt, empfängt der Server (API-Gateway) die Anforderung überhaupt nicht (nichts wird protokolliert). Also glaube ich, dass das Problem darin besteht, die Daten vom Tablet zu bekommen.

Dies ist die Stack-Trace erhalten wir, wenn es fehlschlägt.

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) 

Wenn jemand irgendwelche Ideen hat, warum wir diesen Fehler bekommen und was möglicherweise die Lösung sein könnte, würde ich jeden Hinweis sehr schätzen!

Edit - Wir haben versucht, die Zeitüberschreitung zu erhöhen und der Anruf immer noch nicht das Tablet verlassen. Wir haben bestätigt, dass der Anruf das Tablet nicht über einen Proxy verlässt.

Darüber hinaus scheint das Problem mit der Verwendung von BLE gleichzeitig mit HTTP verbunden zu sein.

Antwort

0

Versuchen Sie Timeout in okhttp

new OkHttpClient.Builder() .connectTimeout(90, TimeUnit.SECONDS).readTimeout(90, TimeUnit.SECONDS) .writeTimeout(90, TimeUnit.SECONDS).build(); 
+0

Ich erhöhte sich das Timeout zunehmende und der Ruf die Tablette noch nicht verlassen. –

Verwandte Themen