2010-10-14 29 views
7

मैं एक http अनुरोध कर रहा हूं। मैं एक मंच (एंड्रॉइड) पर हूं जहां नेटवर्क ऑपरेशंस अक्सर असफल होते हैं क्योंकि नेटवर्क कनेक्शन तुरंत उपलब्ध नहीं हो सकता है। इसलिए मैं पूरी तरह असफल होने से पहले एक ही कनेक्शन को एन बार कोशिश करना चाहता हूं। कुछ इस तरह की सोच रहा था:एक http कनेक्शन पुनः प्रयास

DefaultHttpClient mHttp = ...; 

public HttpResponse runHttpRequest(HttpRequestBase httpRequest) 
    throws IOException 
{ 
    IOException last = null; 
    for (int attempt = 0; attempt < 3; attempt++) { 
     try { 
      HttpResponse response = mHttpClient.execute(httpRequest); 
      int statusCode = response.getStatusLine().getStatusCode(); 
      if (statusCode == 200) { 
       return response; 
      } 
     } catch (IOException e) { 
      httpRequest.abort(); 
      last = e; 
     } 
    } 

    throw last; 
} 

मैं ज्यादातर कनेक्शन कुछ राज्य जो बाद में पुनः पर अमान्य है में किया जा रहा बारे में चिंतित हूँ। दूसरे शब्दों में, क्या मुझे 'httpRequest' को पूरी तरह से पुनर्निर्मित करने की आवश्यकता है, क्या मुझे पकड़ ब्लॉक में httpRequest.abort() को कॉल करने से बचना चाहिए, और केवल इसे अंतिम विफलता में कॉल करना चाहिए?

धन्यवाद

उत्तर

7

प्रलेखन कि ऐसी बात हो जाएगा उल्लेख नहीं है, हालांकि आप इसे करने की कोशिश करना होगा। सबसे महत्वपूर्ण बात यह है कि, कुछ चीजें हैं जिन पर आपको अपने कोड के साथ विचार करना चाहिए ...

  1. आपको शायद कॉलर को इस मान को निर्दिष्ट करने की अनुमति देने के लिए रीट्रीज़ की संख्या का खुलासा करना चाहिए।
  2. आपको अपवाद को फेंकने पर ही पुनः प्रयास करना चाहिए; आप वर्तमान में 200 रन प्राप्त करते समय पुनः प्रयास करते हैं। हालांकि, उदाहरण के लिए, आपको 404 मिलते हैं ... इसका मतलब यह नहीं है कि आपका अनुरोध इस विफलता में विफल रहा है कि नेटवर्क विफल नहीं हुआ ... बल्कि, आपने एक सफल राउंड- सर्वर की यात्रा, लेकिन सर्वर के पास अनुरोधित संसाधन नहीं है ... इसलिए इस तरह के मामले में पुनः प्रयास करने के लिए वास्तव में यह समझ में नहीं आता है।
  3. जैसा कि है, आप विभिन्न प्रकार के अपवादों के सभी प्रकार को दबा सकते हैं। किसी सूची में होने वाले सभी अपवादों को रिकॉर्ड करना और किसी भी प्रकार की परिणाम ऑब्जेक्ट को वापस करना समझ सकता है जिसमें सभी अपवादों की सूची के अलावा प्रतिक्रिया (संभावित रूप से सभी प्रयास विफल हो जाते हैं) को वापस लेते हैं। अन्यथा, आप अपवादों के सेट से कुछ मनमाने ढंग से अपवाद फेंक देते हैं, संभवतः असफलता को अस्पष्ट करते हैं।
  4. अभी आप एक ही अनुरोध के साथ बार-बार हथियार लेते हैं ... अगर भीड़ हो, तो आप इसे जोड़ रहे हैं। और यदि आपके आईपी पते पर बहुत अधिक गतिविधि के लिए प्रतिबंध लगा दिया गया था, तो आप शायद उसमें शामिल होने जा रहे हैं ... किसी भी तरह के पुनः प्रयास तर्क में बैक-ऑफ व्यवहार होना चाहिए जहां रिट्रीज़ के बीच कुछ इंतजार है और अंतराल बढ़ता है प्रत्येक विफलता।
3

मैं (मैं एक डेवलपर हूँ) jcabi-aspects से AOP और जावा एनोटेशन का उपयोग करने की सलाह देते हैं:

@RetryOnFailure(attempts = 3, delay = 5) 
public String load(URL url) { 
    return url.openConnection().getContent(); 
} 
संबंधित मुद्दे