2013-02-26 16 views
7

से URLConnection ऑब्जेक्ट को हटा रहा है मेरे प्रोग्राम में मुझे कुछ HTTP सर्वर पर खुले कनेक्शन की सूची ट्रैक करने की आवश्यकता है - यदि आवश्यक हो तो उन्हें एक साथ डिस्कनेक्ट करने के लिए।ArrayList <URLConnection>

मुझे निम्नलिखित समस्या का सामना करना पड़ा। यदि मैं HTTP सर्वर से कनेक्ट करता हूं तो सबकुछ सही काम करता है, लेकिन अगर HTTPS पर है, तो कनेक्शन सूची से हटा नहीं दिए जाते हैं। यह स्मृति रिसाव की ओर जाता है।

उदाहरण:

package test; 

import java.net.URL; 
import java.net.URLConnection; 
import java.util.ArrayList; 

public class Main { 

    public static void main(String[] args) { 
     try { 
      ArrayList<URLConnection> al = new ArrayList<URLConnection>(); 

      URL url = new URL("http://www.example.com"); 

      URLConnection conn = url.openConnection(); 
      al.add(conn); 
      System.out.println("Result of removing = " + al.remove(conn)); 

     } catch (Exception ex) { 
      ex.printStackTrace(System.err); 
     } 
    } 
} 

तो URL भेजता है "http://www.example.com" फिर "को हटाने = सच का परिणाम"।

लेकिन यदि यूआरएल "https://www.example.com" पर इंगित करता है तो "हटाने का परिणाम = झूठा"।

मुझे ऐसा व्यवहार समझ में नहीं आता है। मेरे पास कुछ धारणाएं हैं, लेकिन सुनिश्चित नहीं हैं ...

क्या कोई मदद कर सकता है?

उत्तर

6

संक्षेप में (कम से कम, हॉटस्पॉट जेवीएम 23.7-बी 01 के साथ) हमारे पास conn.equals(conn)==false है जब URL योजना HTTPS है।

आपरेशन remove(Object o) एक तत्व को हटाने ई के रूप में defined है ऐसी है कि (o==null ? e==null : o.equals(e)) (अर्थात निकाल के बराबर होती है के संदर्भ में परिभाषित किया गया है)। कोई उम्मीद कर सकता है कि निकालें (conn) सफल हो गया है, क्योंकि तत्व अभी डाला गया है, लेकिन conn.equals(conn)false है, संग्रह कार्यान्वयन समझता है कि तत्व निहित नहीं है।

यह एक अजीब मामला है जहां बराबर नहीं है। the openjdk implementation से कारण स्पष्ट है: HttpsURLConnectionImpl के कार्यान्वयन को आंतरिक ऑब्जेक्ट के बराबर करता है, जो रैपर में के बराबर नहीं है।

public class HttpsURLConnectionImpl { 
    protected DelegateHttpsURLConnection delegate; 
    public boolean equals(Object obj) { 
    return delegate.equals(obj); 
    } 
} 
+0

तो, यह वास्तव में _equals _.. के अजीब व्यवहार का मामला है। मैंने इस तरह के स्पष्टीकरण को भेजा क्योंकि यह वास्तव में पागल है ... धन्यवाद! बीटीडब्ल्यू, क्या आप ऐसे _equals_ व्यवहार वाले वर्गों के किसी अन्य उदाहरण को नहीं जानते? –

+0

नहीं, वास्तव में मुझे यह भी पता नहीं था। * बराबर * के एक दोषपूर्ण कार्यान्वयन का एकमात्र मामला * जिसे मैं अब याद कर सकता हूं वह java.net.URL है (इस मामले में दोष स्थिरता के बारे में है: समानता संबंध DNS रिज़ॉल्यूशन पर निर्भर करता है, इस प्रकार दो यूआरएल उदाहरण हो सकते हैं या नहीं हल किए गए आईपी पते के आधार पर बराबर हो, लेकिन यह एक अलग कहानी है)। – Javier

+0

अब सब कुछ स्पष्ट है। धन्यवाद! –