Подтвердить что ты не робот

EOFException при дооснащении при выполнении синхронных запросов PUT

В моем приложении я делаю синхронные запросы PUT, используя библиотеку Retrofit. Проблема в том, что иногда библиотека бросает EOFException s.

Ниже приведен тракт стека для одного из таких случаев.

29099-29269/com.mycompany.myapp D/Retrofit﹕ java.io.EOFException
  at okio.RealBufferedSource.readUtf8LineStrict(RealBufferedSource.java:192)
  at com.squareup.okhttp.internal.http.HttpConnection.readResponse(HttpConnection.java:189)
  at com.squareup.okhttp.internal.http.HttpTransport.readResponseHeaders(HttpTransport.java:101)
  at com.squareup.okhttp.internal.http.HttpEngine.readResponse(HttpEngine.java:676)
  at com.squareup.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:426)
  at com.squareup.okhttp.internal.huc.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:371)
  at com.squareup.okhttp.internal.huc.HttpURLConnectionImpl.getResponseCode(HttpURLConnectionImpl.java:466)
  at retrofit.client.UrlConnectionClient.readResponse(UrlConnectionClient.java:73)
  at retrofit.client.UrlConnectionClient.execute(UrlConnectionClient.java:38)
  at retrofit.RestAdapter$RestHandler.invokeRequest(RestAdapter.java:321)
  at retrofit.RestAdapter$RestHandler.invoke(RestAdapter.java:240)
  at $Proxy7.addEvents(Native Method)
  at com.mycompany.myapp.api.MyService.addEvents(MyService.java:59)

Я пробовал следующие предполагаемые решения, но ни один из них не помог в моем случае:

Вот как я создаю RestAdapter в своем приложении:

OkHttpClient okHttpClient = new OkHttpClient();

RestAdapter restAdapter = new RestAdapter.Builder()
  .setEndpoint(Url)
  .setRequestInterceptor(new RequestInterceptor()
  {
      @Override
      public void intercept(RequestFacade request)
      {
          request.addHeader("Accept", "application/json");
          request.addHeader("Content-Type", "application/json");
      }
  })
  .setClient(new OkClient(okHttpClient))
  .setLogLevel(RestAdapter.LogLevel.FULL)
  .setErrorHandler(new MyErrorHandler())
  .build();

Кто-нибудь знает другое решение проблемы?

Btw, я не могу использовать решения, связанные с System.setProperty("http.keepAlive", "false");, потому что мне нужно поддерживать мое соединение по причине производительности.

4b9b3361

Ответ 1

Возможно, EOF как потерянное сетевое соединение или тайм-аут. Попытайтесь увеличить тайм-аут и обеспечить сохранение работоспособности.

Ответ 2

Вы можете посмотреть этот ответ с аналогичной проблемой.

Если у вас большие запросы (я думаю, что это более 50 МБ данных), и вы не используете систему разбиения на страницы на стороне сервера, вы можете получить этот тип ошибок.

Кроме того, это может быть TimeOut на стороне сервера, например.

Ответ 3

Эта проблема обычно может быть вызвана сетевой ошибкой. Если он воспроизводит последовательно, рассмотрите потенциальную причину длины контента и тайм-аута запроса. Иногда время ожидания сетевых запросов может вернуть неправильный конец файла. Который бы выбросил эту ошибку в результате.