2016-06-17 8 views
7

है, मैं OkHttpClient के लिए कनेक्शन विफलता विकल्प पर पुनः प्रयास कर रहा हूं।क्या ओकेएचटीपी क्लाइंट में अधिकतम रेट्री गिनती

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

मुझे यह जानना होगा कि यह कितनी बार कोशिश करेगा। source code पर देखकर मुझे कोई अधिकतम सीमा दिखाई नहीं दे रही थी। मैं कुछ प्रयासों के बाद प्रयास करना बंद करने के लिए क्लाइंट को कैसे कॉन्फ़िगर कर सकता हूं?

उत्तर

5

अधिक डॉक्स यहाँ https://square.github.io/okhttp/3.x/okhttp/okhttp3/OkHttpClient.Builder.html#retryOnConnectionFailure-boolean-

कॉन्फ़िगर पुनः प्रयास करें या नहीं करने के लिए जब एक कनेक्टिविटी समस्या का सामना करना पड़ा है इस ग्राहक कर रहे हैं। डिफ़ॉल्ट रूप से, इस ग्राहक चुपचाप निम्न समस्याओं से ठीक:

  • पहुंचा नहीं जा सकता IP पते। यदि यूआरएल के होस्ट में कई आईपी पते हैं, तो किसी भी व्यक्तिगत आईपी पते तक पहुंचने में विफलता समग्र अनुरोध में विफल नहीं होती है। यह बहु-गृह सेवाओं की उपलब्धता में वृद्धि कर सकता है।
  • स्टेल पूल कनेक्शन। कनेक्शनपूल अनुरोध विलंबता को कम करने के लिए सॉकेट का पुन: उपयोग करता है, लेकिन ये कनेक्शन कभी-कभी समाप्त हो जाएंगे।

  • पहुंच योग्य प्रॉक्सी सर्वर। अनुक्रम में एकाधिक प्रॉक्सी सर्वरों का प्रयास करने के लिए एक प्रॉक्सी चयनकर्ता का उपयोग किया जा सकता है, अंततः प्रत्यक्ष कनेक्शन पर वापस आना।

ऐसा करने पर अनुरोधों को पुनः प्रयास करने से बचने के लिए इसे गलत पर सेट करें विनाशकारी है। इस मामले में कॉलिंग एप्लिकेशन को कनेक्टिविटी विफलताओं की अपनी वसूली करनी चाहिए।

लेकिन आम तौर पर, मेरा मानना ​​है कि यह मौजूदा स्टेल कनेक्शन या वैकल्पिक पथों को फिर से प्रयास करने के लिए फिर से प्रयास करना है। अनिश्चित काल तक वही चीज़ पुनः प्रयास नहीं करें।

भी देखें ConnectionSpecSelector.connectionFailed

+0

यह मेरी समझ भी है। इसके अलावा, यह एक असफल एसएसएल हैंडशेक भी पुनः प्रयास करेगा। लेकिन ऐसा लगता है कि एक पूरी तरह से टीसीपी कनेक्शन विफलता पुनः प्रयास करने के लिए प्रतीत नहीं होता है। – RajV

1

अधिकतम सीमा निर्धारित करने के लिए कोई भी निर्मित विधि नहीं है, लेकिन आप नीचे की तरह एक इंटरसेप्टर जोड़ सकते हैं।

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; 
    } 
}); 

इंटरसेप्टोस पर अधिक जानकारी here मिल सकती है।

+0

response.isSuccessful() HTTP स्थिति कोड के लिए जाँच करता है। क्या यह कनेक्शन विफलता के लिए काम करेगा? – RajV

+0

हां। यदि प्रतिक्रिया कोड 2xx या 3xx है, तो 'असफल() '' सत्य' वापस आ जाएगा। बाकी के लिए, यह 'झूठी' वापस आ जाएगा। और कनेक्शन विफलता ज्यादातर 4xx हैं, इसलिए इसे काम करना चाहिए। –

+0

टीसीपी कनेक्शन विफलता का मतलब है कि कोई HTTP अनुरोध भेजा या प्रतिक्रिया प्राप्त नहीं की जा सकती है। मुझे यकीन नहीं है कि स्टेटस कोड 4xx कैसे होगा। – RajV

2

मैं नीचे एक वैकल्पिक हल बनाया:

@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

यह मेरे लिए पूरी तरह से काम कर रहा है। बहुत बहुत धन्यवाद। – yoavgray

संबंधित मुद्दे