2010-11-16 54 views
8

मेरे पास कुछ कोड है जो एक फ़ाइल डाउनलोड करने के लिए यूआरएल से जुड़ता है, और उसके बाद कुछ प्रसंस्करण करता है। हालांकि, कभी-कभी मुझे त्रुटि java.net.SocketException: Connection reset प्राप्त हो रही है।अपवाद, और कनेक्शन रीसेट होने पर पुनः प्रयास कैसे करें?

मैं इस त्रुटि को प्राप्त करने पर फ़ाइल डाउनलोड करने के लिए पुनः प्रयास करना चाहता हूं, इसे छोड़ने से पहले अधिकतम 3 बार कहें। मैं जानना चाहता हूं कि इसे ढांचा बनाने का सबसे अच्छा तरीका क्या होगा।

क्या निम्न ठीक दिखता है। while लूप के अंदर try-catch ब्लॉक को स्थानांतरित करने के लिए स्वीकार्य लगता है, या क्या कोई बेहतर तरीका है?

सभी मदद की बहुत सराहना की जाती है!

while(!connected && retries > 0) { 
    retries--; 
    URL downloadUrl; 
    URLConnection conn; 

    try { 
    downloadUrl = new URL(url); 
    conn = downloadUrl.openConnection(); 
    conn.connect(); 
    connected = true; 
    // Perform processing on downloaded file here 

    } catch (IOException e) { 
    Logger.batchLog(e); 
    } 
} 

उत्तर

1

मुझे लगता है कि करने के लिए है कि एक अपवाद निगलने हमेशा बुरा है वायर्ड किया गया है, लेकिन मैं यहाँ लगता है, कि एक ही रास्ता है, तो कनेक्शन वास्तव में रीसेट किया गया था बताने के लिए है। मुझे लगता है कि आप अपनी आवश्यकताओं के अनुसार अपवाद को संभालने में कामयाब रहे हैं, इसलिए यह सब कुछ है।

लेकिन हालांकि, मैं इसे बना दूंगा ताकि आप अंतिम अपवाद को निगल न सकें। यदि यह तीन बार विफल रहता है, तो आप उस अपवाद को फिर से भरना चाहेंगे या किसी भी तरह से शानदार तरीके से असफल हो जाएंगे।

+0

तो क्या ऐसा कुछ ठीक होगा, या चीजों से निपटने का एक बुरा तरीका होगा? पकड़ो (IOException ई) { Logger.batchLog (ई); अगर (retries == 0) { फेंक ई; } } – QuakerOat

+0

हाँ। यह अच्छा होना चाहिए। या फेंकने के बजाय, आप उपयोगकर्ता को समाप्त और बता सकते हैं कि सर्वर उपलब्ध नहीं है। हालांकि आप इसे संभालते हैं, आपको अपवाद नहीं खाना चाहिए जैसे कुछ भी नहीं हुआ। जो मुझे नहीं लगता कि आपको अभी समस्या है। साथ ही, आप केवल java.net.SocketException को पकड़ना चाहते हैं और सभी IOExceptions नहीं, क्योंकि यह एकमात्र चीज है जिसे आप जानते हैं (या चाहते हैं) को संभालने के लिए। – shoebox639

3

यह ऐसी चीज है जो मैं खुद को लिखने के बजाय बुलेट प्रूफ कनेक्शन पूल को संभालने की बजाय चाहूंगा।

-1

एओपी और जावा एनोटेशन में मदद करनी चाहिए।

@RetryOnFailure(attempts = 3, delay = 5) 
public String load(URL url) { 
    return url.openConnection().getContent(); 
} 

तुम भी Cactoos से RetryFunc कोशिश कर सकते हैं: मैं jcabi-aspects से पढ़ने निर्मित तंत्र (मैं एक डेवलपर हूँ) की सिफारिश करेंगे।

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