Как я могу по-разному обрабатывать время ожидания подключения и время ожидания клиента при модернизации с помощью okhttp3

Я работаю над клиентской библиотекой REST для обмена мгновенными сообщениями, которая взаимодействует с сервером REST и принадлежит третьей стороне (я никак не могу прикоснуться к коду или логике на стороне сервера), используя модификацию v2.1.0.

По какой-то причине я продолжаю получать java.net.SocketTimeoutException при синхронном вызове интерфейса.

java.net.SocketTimeoutException: timeout
    at okio.Okio$3.newTimeoutException(Okio.java:212) ~[okio-1.8.0.jar:?]
    at okio.AsyncTimeout.exit(AsyncTimeout.java:288) ~[okio-1.8.0.jar:?]
    at okio.AsyncTimeout$2.read(AsyncTimeout.java:242) ~[okio-1.8.0.jar:?]
    at okio.RealBufferedSource.indexOf(RealBufferedSource.java:325) ~[okio-1.8.0.jar:?]
    at okio.RealBufferedSource.indexOf(RealBufferedSource.java:314) ~[okio-1.8.0.jar:?]
    at okio.RealBufferedSource.readUtf8LineStrict(RealBufferedSource.java:210) ~[okio-1.8.0.jar:?]
    at okhttp3.internal.http.Http1xStream.readResponse(Http1xStream.java:184) ~[okhttp-3.3.0.jar:?]
    at okhttp3.internal.http.Http1xStream.readResponseHeaders(Http1xStream.java:125) ~[okhttp-3.3.0.jar:?]
    at okhttp3.internal.http.HttpEngine.readNetworkResponse(HttpEngine.java:775) ~[okhttp-3.3.0.jar:?]
    at okhttp3.internal.http.HttpEngine.access$200(HttpEngine.java:86) ~[okhttp-3.3.0.jar:?]
    at okhttp3.internal.http.HttpEngine$NetworkInterceptorChain.proceed(HttpEngine.java:760) ~[okhttp-3.3.0.jar:?]
    at okhttp3.internal.http.HttpEngine.readResponse(HttpEngine.java:613) ~[okhttp-3.3.0.jar:?]
    at okhttp3.RealCall.getResponse(RealCall.java:244) ~[okhttp-3.3.0.jar:?]
    at okhttp3.RealCall$ApplicationInterceptorChain.proceed(RealCall.java:201) ~[okhttp-3.3.0.jar:?]
    at okhttp3.RealCall.getResponseWithInterceptorChain(RealCall.java:163) ~[okhttp-3.3.0.jar:?]
    at okhttp3.RealCall.execute(RealCall.java:57) ~[okhttp-3.3.0.jar:?]
    at retrofit2.OkHttpCall.execute(OkHttpCall.java:174) ~[retrofit-2.1.0.jar:?]

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

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

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

Любая идея, как я могу достичь цели, которая определяет полученное исключение SocketTimeoutException, это тайм-аут клиента или тайм-аут соединения, и повторная попытка только по тайм-ауту соединения?

Обновление 1

Код, который я использую для создания клиента okhttp и сервиса модернизации:

public SampleApi createSampleService() {
    OkHttpClient.Builder clientBuilder = new OkHttpClient().newBuilder()
            .retryOnConnectionFailure(true)
            .connectTimeout(30, TimeUnit.SECONDS)
            .writeTimeout(30, TimeUnit.SECONDS);
            .readTimeout(30, TimeUnit.SECONDS);
    return new Retrofit.Builder()
            .baseUrl(BASE_URL)
            .client(clientBuilder.build())
            .build()
            .create(SampleApi.class);
}

Я установил здесь значение retryOnConnectionFailure в значение true, предотвратит ли это выдачу ошибки тайм-аута соединения, потому что он будет повторять попытки до тех пор, пока соединение не будет успешным, поэтому единственная ошибка тайм-аута, которую я могу получить, это тайм-аут чтения клиента? Интересно, сколько раз он будет повторяться и что будет после этого.

0 ответов

Другие вопросы по тегам