2017-09-20 5 views
2
private boolean isRecoverable(IOException e, boolean requestSendStarted) { 
    .... 
    // If there was an interruption don't recover, but if there was a 
    //timeout connecting to a route 
    // we should try the next route (if there is one). 
    if (e instanceof InterruptedIOException) { 
     return e instanceof SocketTimeoutException && !requestSendStarted; 
    } 
    .... 
    return true; 
} 

코드 예는 RetryAndFollowUpInterceptor이고 OKHttp입니다.SocketTimeoutException이 발생했을 때 OKHttp가 다시 시도되지 않도록 설계된 이유

내 질문에 및 requestSendStarted == true 일 때 OkHttp이 다시 시도하지 않는 이유는 무엇입니까?

내가 다른 라우터가있는 경우, 우리는 목표는 OkHttp 전혀 연결할 수없는 경우 재 시도했다

답변

2

다른 IP 또는 라우터를 다시 시도 할 수 있습니다 생각하기 때문에. 서버에 연결할 수 있었지만 느리게 응답 한 경우 재 시도가 도움이되지 않는 응용 프로그램 계층 문제 일 가능성이 높습니다.

+1

제게는 의미가 있습니다. 따라서 사용자가 다시 시도하기를 원할 경우 OKHttp Source를 수정하거나 이런 종류의 Exceptions를 catch하고 사용자 정의 인터셉터에서 어떤 작업을 수행 할 수 있습니까? – cafecat

+0

예, 인터셉터에서 예외를 catch하고 다시 시도 할 수 있습니다. –

2

응답 데이터가 클라이언트에 전송되었을 때 요청이 성공적으로 전송되고 문제가 발생한 경우를 고려하십시오. 이 경우 자동 재 시도는 서버가 일부 동작 (일부 카운트 증가, 어딘가에서 레코드 작성)을 반복하도록하여 바람직하지 않을 수 있습니다. OKHttp는 사용자가이 경우 무엇을 해야할지 결정하도록합니다.

+0

그래서 사용자가 이런 종류의 예외를 잡아 맞춤형 인터셉터에서 뭔가를 할 수 있다는 것을 의미합니까? – cafecat

+0

onFailure 콜백 사용자의 @cafecat 사용자는 수행 할 작업을 결정할 수 있습니다. 다른 요청을 보내거나 오류 메시지를 표시하거나 다른 작업을 수행 할 수 있습니다. – algrid