2016-06-17 34 views
7

Sto impostando l'opzione di tentativo su connessione fallita per OkHttpClient.OkHttpClient ha un numero massimo di tentativi

client = new OkHttpClient(); 
client.setRetryOnConnectionFailure(true); 

Mi piacerebbe sapere quante volte continuerà a provare. Guardando il source code non ho visto alcun limite massimo. Come posso configurare il client affinché smetta di provare dopo alcuni tentativi?

risposta

5

Non ci sono altri documenti qui https://square.github.io/okhttp/3.x/okhttp/okhttp3/OkHttpClient.Builder.html#retryOnConnectionFailure-boolean-

Configura questo client per riprovare oppure no, quando un problema di connettività è incontrato. Per impostazione predefinita, questo client recupera in silenzio tra le seguenti problemi:

  • indirizzi IP irraggiungibile. Se l'host dell'URL ha più indirizzi IP, il mancato raggiungimento di un singolo indirizzo IP non ha esito negativo sulla richiesta complessiva. Questo può aumentare la disponibilità di servizi multi-homed.
  • Connessioni poolate stantie. ConnectionPool riutilizza i socket per ridurre la latenza delle richieste, ma occasionalmente queste connessioni scadono.

  • Server proxy non raggiungibili. Un ProxySelector può essere utilizzato per tentare più server proxy in sequenza, ricadendo infine su una connessione diretta.

Impostare questo su falso per evitare riprovare richieste quando ciò è distruttivo. In questo caso l'applicazione chiamante dovrebbe fare il proprio recupero dei guasti di connettività.

Ma in generale, credo che sia destinato a riprovare quando c'è una connessione stantia esistente o percorsi alternativi che possono essere riprovati. Non riprovare esattamente la stessa cosa indefinitamente.

vedere anche ConnectionSpecSelector.connectionFailed

+0

Anche questa è la mia comprensione. Inoltre, riproverà anche un handshake SSL non riuscito. Ma non sembra riprovare un errore di connessione TCP a titolo definitivo. – RajV

1

Non esiste un metodo integrato per impostare il limite massimo, ma è possibile aggiungere un intercettore come di seguito.

client.interceptors().add(new Interceptor() { 
    @Override 
    public Response intercept(Chain chain) throws IOException { 
     Request request = chain.request(); 

     // try the request 
     Response response = chain.proceed(request); 

     int tryCount = 0; 
     int maxLimit = 3; //Set your max limit here 

     while (!response.isSuccessful() && tryCount < maxLimit) { 

      Log.d("intercept", "Request failed - " + tryCount); 

      tryCount++; 

      // retry the request 
      response = chain.proceed(request); 
     } 

     // otherwise just pass the original response on 
     return response; 
    } 
}); 

Ulteriori dettagli su interceptos possono essere trovati here.

+0

response.isSuccessful() verifica la presenza di codice di stato HTTP. Funzionerà per il fallimento della connessione? – RajV

+0

Sì. se il codice di risposta è 2xx o 3xx, 'isSuccessful()' restituirà 'true'. Per riposare, restituirà 'false'. E i guasti di connessione sono per lo più 4xx, quindi dovrebbe funzionare. –

+0

Errore di connessione TCP significa che nessuna richiesta HTTP può essere inviata o risposta ottenuta. Non sono sicuro di come il codice di stato sarà 4xx. – RajV

2

ho fatto una soluzione di seguito:

@Override 
public Response intercept(Chain chain) throws IOException { 
    Request request = chain.request(); 
    // try the request 
    Response response = doRequest(chain,request); 
    int tryCount = 0; 
    while (response == null && tryCount <= RetryCount) { 
    String url = request.url().toString(); 
    url = switchServer(url); 
    Request newRequest = request.newBuilder().url(url).build(); 
    tryCount++; 
    // retry the request 
    response = doRequest(chain,newRequest); 
    } 
    if(response == null){//important ,should throw an exception here 
     throw new IOException(); 
    } 
    return response; 
} 

private Response doRequest(Chain chain,Request request){ 
    Response response = null; 
    try{ 
     response = chain.proceed(request); 
    }catch (Exception e){ 
    } 
    return response; 
} 
+0

Funziona perfettamente per me. Molte grazie. – yoavgray

Problemi correlati