मेरा सर्वर प्रति अनुरोध के आधार पर अपनी प्रतिक्रिया बनाने के लिए आंतरिक वेब सेवा से डेटा का उपयोग करता है। मैं अनुरोध करने के लिए अपाचे एचटीपी क्लाइंट 4.1 का उपयोग कर रहा हूं। प्रत्येक प्रारंभिक अनुरोध के परिणामस्वरूप वेब सेवा के लिए लगभग 30 अनुरोध होंगे। इनमें से 4 - 8 CLOSE_WAIT में फंस गए सॉकेट के साथ समाप्त हो जाएंगे, जो कभी भी रिलीज़ नहीं होते हैं। आखिरकार ये अटक गए सॉकेट मेरे उलझन से अधिक हो जाते हैं और मेरी प्रक्रिया फाइल डिस्क्रिप्टर से बाहर हो जाती है।मैं कैसे सुनिश्चित कर सकता हूं कि मेरा एचटीपी क्लाइंट 4.1 सॉकेट को रिसाव नहीं करता है?
मैं सिर्फ अपना उलिमिट (1024) नहीं उठाना चाहता, क्योंकि इससे समस्या हल हो जाएगी।
कारण मैं एचटीपी क्लाइंट में स्थानांतरित हो गया हूं यह है कि java.net.HttpUrlConnection वैसे ही व्यवहार कर रहा था।
मैंने प्रति अनुरोध एकल क्लाइंट कॉनमैनर पर जाने की कोशिश की है, और क्लाइंट.getकोनक्शन मैनेजर() को बंद कर दिया है। लेकिन सॉकेट अभी भी अटक गया है।
क्या मुझे इसे हल करने की कोशिश करनी चाहिए ताकि मैं 0 खुले सॉकेट के साथ समाप्त हो, जबकि कोई रनिंग अनुरोध नहीं है, या क्या मुझे अनुरोध दृढ़ता और पूलिंग पर ध्यान देना चाहिए?
स्पष्टता के लिए मैं कुछ जानकारी जो प्रासंगिक हो सकता है शामिल कर रहा हूँ:
ओएस: उबंटू 10.10
JRE: 1.6.0_22
भाषा: स्काला 2.8
नमूना कोड:
val cleaner = Executors.newScheduledThreadPool(1)
private val client = {
val ssl_ctx = SSLContext.getInstance("TLS")
val managers = Array[TrustManager](TrustingTrustManager)
ssl_ctx.init(null, managers, new java.security.SecureRandom())
val sslSf = new org.apache.http.conn.ssl.SSLSocketFactory(ssl_ctx, SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER)
val schemeRegistry = new SchemeRegistry()
schemeRegistry.register(new Scheme("https", 443, sslSf))
val connection = new ThreadSafeClientConnManager(schemeRegistry)
object clean extends Runnable{
override def run = {
connection.closeExpiredConnections
connection.closeIdleConnections(30, SECONDS)
}
}
cleaner.scheduleAtFixedRate(clean,10,10,SECONDS)
val httpClient = new DefaultHttpClient(connection)
httpClient.getCredentialsProvider().setCredentials(new AuthScope(AuthScope.ANY), new UsernamePasswordCredentials(username,password))
httpClient
}
val get = new HttpGet(uri)
val entity = client.execute(get).getEntity
val stream = entity.getContent
val justForTheExample = IOUtils.toString(stream)
stream.close()
टेस्ट: netstat -a | grep {myInternalWebServiceName} | ग्रेप CLOSE_WAIT
(सूचियाँ कि CLOSE_WAIT स्थिति में हैं मेरी प्रक्रिया के लिए सॉकेट)
टिप्पणी पोस्ट चर्चा:
इस कोड को अब सही उपयोग को दर्शाता है।
आपके उत्तर के लिए धन्यवाद, मैं सहमत हूं कि दस्तावेज़ीकरण से पता चलता है कि यह एक प्रभावी उपाय होना चाहिए। CLOSE_WAIT में अनाथ सॉकेट की संख्या अभी भी लागू होने वाले ऑफ-थ्रेड क्लीनर के साथ विश्वसनीय रूप से बढ़ती है, इसलिए यह प्रभावी नहीं है। मैंने अपने प्रश्न में कुछ कार्यान्वयन विस्तार जोड़ा है। –
मैं recant। मुझे एहसास नहीं हुआ था कि वास्तविक एप्लिकेशन कोड में मैं व्यावसायिक तर्क करने के लिए पूरक छवि अनुरोध कर रहा था। वे अभी भी HttpClient के परिचय से WS.url विधियों का उपयोग कर रहे थे, और पीछे सॉकेट छोड़ रहे थे। –
टूटा लिंक। (कृपया लिंक के साथ शीर्षक और विवरण शामिल करें।) शायद यह वही जानकारी है? http://hc.apache.org/httpcomponents-client-ga/tutorial/html/connmgmt.html – danorton