java - जावा: HTTP कनेक्शन द्वारा बनाए गए कनेक्शन धागे की प्रतीक्षा में बहुत लंबी अवधि के लिए जीवित हैं



soap httpconnection (1)

मेरे पास सर्वर साइड कोड है जो यह जांचता है कि SOAP सेवा कब है कोड ऐसा दिखता है:

String response = "";

while (response.length() == 0) {
    try {
        final URL url = new URL("DummySoapServiceURL");
        final HttpURLConnection httpConnection = (HttpURLConnection) url.openConnection();
        InputStream inputStream = null;
        try {
            httpConnection.setRequestMethod("GET");

            inputStream = httpConnection.getInputStream();
            final byte[] buffer = new byte[BUFFER_SIZE];
            while (inputStream.read(buffer, 0, BUFFER_SIZE) != -1) {
                response = new String(buffer);
            }
        } finally {
            IOUtils.closeQuietly(inputStream);
            httpConnection.disconnect();
        }
    } catch (MalformedURLException e) {
        // error handling
    } catch (IOException e) {
        // error handling
    }
}

अब समस्या यह है कि, प्रत्येक चेक के करीब 3-4 कनेक्शन धागे बनाए जाते हैं। और ये धागे जीवित हैं, भले ही SOAP सेवा की जांच पूरी हो। धागे डंप का स्नैपशॉट, इन धागे के लिए ऐसा दिखता है:

"http-host/ip:port-11" prio=10 tid=0x00000000064f0000 nid=0x32cc waiting on condition [0x00002b54bc604000]
   java.lang.Thread.State: WAITING (parking)
    at sun.misc.Unsafe.park(Native Method)
    - parking to wait for  <0x00000000d5093c78> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
    at java.util.concurrent.locks.LockSupport.park(LockSupport.java:186)
    at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2043)
    at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442)
    at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1068)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at org.apache.tomcat.util.net.NioEndpoint$DefaultThreadFactory$1$1.run(NioEndpoint.java:1249)
    at java.lang.Thread.run(Thread.java:744)
   Locked ownable synchronizers:
    - None

अब मुझे यकीन नहीं है कि ये कनेक्शन थ्रेड कैसे प्रतीक्षा कर रहे हैं / पार्किंग और उन्हें कैसे बंद करना है मेरे कोड में खोले गए धाराएं बंद हैं और डिस्कनेक्ट () का उपयोग करके कनेक्शन डिस्कनेक्ट कर दिए गए हैं।

मैंने निम्न HTTP प्रॉपर्टी सेट करने का भी प्रयास किया:

httpConnection.addRequestProperty("Connection", "close");

लेकिन यह मदद नहीं किया मुझे संदेह है कि कुछ समय में जावा इन थ्रेड्स को बंद कर सकती हैं। लेकिन मुझे नहीं पता, कब और कैसे? जेडीके संस्करण है jdk1.7.0_51_x64 कृपया मुझे बताएं, मैं इन कनेक्शन थ्रेड नंबरों को बिल्डिंग से कैसे रोक सकता हूं?


अपाचे एचटीटीपी क्लाइंट का उपयोग करने के लिए पूरे कार्यान्वयन का स्थानांतरण किया क्योंकि इसमें बेहतर नियंत्रण के लिए विशेष एपीआई हैं लेकिन यह मदद नहीं किया अपाचे एचटीटीपी क्लाइंट के साथ भी, मैं इन इंतजार कनेक्शन धागे देख सकता था।

अंत में JBOSS HTTP कनेक्टर कॉन्फ़िगरेशन के लिए redhat वेबसाइट पर संकेत मिला। HTTP कनेक्टर के लिए कॉन्फ़िगर थ्रेड पूल और यह समस्या हल:

<subsystem xmlns="urn:jboss:domain:threads:1.1"> 
    <thread-factory name="http-connector-factory" group-name="uq-thread-pool" thread-name-pattern="HTTP-%t" priority="9"/> 
    <unbounded-queue-thread-pool name="uq-thread-pool"> 
        <max-threads count="5"/> 
        <keepalive-time time="5" unit="seconds"/> 
        <thread-factory name="http-connector-factory"/> 
    </unbounded-queue-thread-pool> 
</subsystem> 

<subsystem xmlns="urn:jboss:domain:web:2.2" default-virtual-server="default-host" native="false">

    <connector name="http" protocol="org.apache.coyote.http11.Http11NioProtocol" scheme="http" socket-binding="http" executor="uq-thread-pool"/> 
    ....
    ....