2012-05-29 14 views
6

प्राप्त करने के बाद टीसीपी कनेक्शन क्यों बंद नहीं हुआ है हम अपाचे कैमल को ऑर्केस्ट्रेशन इंजन के रूप में उपयोग कर रहे हैं। आमतौर पर, इस परिदृश्य पर:अपाचे कैमल: 200 ओके

ग्राहक भेजता HTTP अनुरोध < -> केमल कोड < -> बाहरी सर्वर (रों)

गेंद रोल करने के लिए जब हमारे ग्राहक हमारे केमल कोड को HTTP अनुरोध भेजता है शुरू होता है। ऊंट कोड बाहरी सर्वरों को आरईएसटी HTTP कॉल के माध्यम से ट्रिगर करेगा। आखिरकार, ऊंट कोड ग्राहक को एक उत्तर वापस भेज देगा।

क्लाइंट को प्रतिक्रिया भेजने से पहले अंतिम कार्रवाई, ऊंट कोड बाहरी सर्वर की ओर HTTP प्राप्त करता है। तो पहले एक टीसीपी कनेक्शन सेटअप किया जाता है, फिर डेटा भेजा जाता है। कुछ समय बाद (इसमें 5 से 10 सेकंड लग सकते हैं), बाहरी सर्वर 200 ओके के साथ जवाब देता है।

समस्या: 200 ओके प्राप्त करने के बाद ऊंट बाहरी सर्वर पर एक टीसीपी फिन भेजता नहीं है। नतीजतन, टीसीपी कनेक्शन खुला रहता है ... (बाहरी सर्वर फिर 200 सेकंड के टाइमआउट के बाद टीसीपी कनेक्शन को बंद कर देता है, लेकिन इसका मतलब है कि 200 सेकंड के दौरान एक टीसीपी संसाधन खो गया)।

तो, टीसीपी स्तर पर, यह इस प्रकार है: बाहरी सर्वर

कैमल < ---------->

TCP SYN --> 
    <-- TCP SYN,ACK 
    TCP ACK --> 

    HTTP GET --> 
    <-- 200 OK 
    TCP ACK --> 

    <200 seconds later> 
    <-- TCP FIN,ACK 
    TCP ACK --> 

किसी भी विचार कैसे मैं ऊंट बंद हो सकता है 200 ओके प्राप्त करने के बाद टीसीपी कनेक्शन?

नोट: मैंने "कनेक्शन: क्लोज़" हेडर जोड़ने की कोशिश की, लेकिन ऊंट ने हेडर नहीं जोड़ा?

exchange.getOut().setHeader("Connection","Close"); 

मैं ग्रहण आईडीई के साथ एक स्प्रिंग ढांचे में कैमल 2.9.1 का उपयोग कर रहा: यह इसे अनदेखा करने के लिए ...

इस शीर्ष लेख जोड़ने के लिए कोड था लग रहा था।

+0

आप कौन से ऊंट http घटक का उपयोग करते हैं? –

+0

हाय, मैं ऊंट 2.9.2 का उपयोग कर रहा (नहीं 2.9.1 के रूप में मैं पहले ही उल्लेख किया :() और ऊंट-http-2.9.2.jar (और कॉमन्स-httpclient-3.1.jar)। – opstalj

+0

आप के साथ इस व्यवहार को पुनः कर सकते हैं किसी भी HTTP सर्वर? या ग्राहक के सर्वर केवल एक ही है कि कनेक्शन? –

उत्तर

4

दुर्भाग्यवश, मुझे एक कस्टम HttpHeaderFilterStrategy क्लास बनाने से एक और समाधान नहीं मिला जो कनेक्शन शीर्षलेख को फ़िल्टर नहीं करता है। फिर बाहरी सर्वर पर मेरा अनुरोध भेजने से पहले, मैं हेडर "कनेक्शन: क्लोज़" सेट कर रहा हूं। जैसे ही इस अनुरोध को उत्तर दिया जाता है, तब ऊंट कोड टीसीपी कनेक्शन को बंद करने के लिए एक टीसीपी फिन, एसीके भेजता है।

अधिक विवरण:

1) एक कस्टम HttpHeaderFilterStrategy वर्ग, जैसे बनाने के लिए: CustomHttpHeaderFilterStrategy

2) applicationContext.xml अनुकूलन तो यह उस वर्ग के लिए अंक, जैसे:

<bean id="http" class="org.apache.camel.component.http.HttpComponent"> 
    <property name="camelContext" ref="camel"/> 
    <property name="headerFilterStrategy" ref="myHeaderFilterStrategy"/> 
</bean> 

<bean id="myHeaderFilterStrategy" class="com.alu.iptc.com.CustomHttpHeaderFilterStrategy"> 
</bean> 

3) अपने कोड को अनुकूलित करें, ताकि कनेक्शन: क्लोज़ हेडर सेट हो, उदाहरण के लिए:

exchange.getOut().setHeader("Connection","close"); 
1

HTTP1.1 कनेक्शन को कुछ समय के लिए पहले संदेश के बाद जीवित रखा जाना माना जाता है ताकि कई कारणों को प्रदर्शन कारणों से एक टीसीपी सत्र में वितरित किया जा सके। आम तौर पर, एक http सर्वर एकाधिक फ़ाइलों को डाउनलोड करने की अनुमति देते हुए थ्रेड को बचाने के लिए कुछ सेकंड के बाद कनेक्शन काट सकता है। ऊंट http घटक शायद वैसे ही व्यवहार करेगा। http://en.wikipedia.org/wiki/HTTP_persistent_connection

आधिकारिक HTTP ग्राहक जो ऊंट पर निर्भर करता है का उपयोग करें या लगातार कनेक्शन का उपयोग नहीं करने के लिए विन्यस्त किया जा सकता, लेकिन डिफ़ॉल्ट सत्य है: http://docs.oracle.com/javase/1.5.0/docs/guide/net/http-keepalive.html

हालांकि मैं इसे करने की कोशिश नहीं की है, यह एक स्थापित करने के लिए संभव हो जाना चाहिए प्रणाली संपत्ति कॉन्फ़िगर करने के लिए इस

http.keepAlive=<boolean> 

आप ऊंट संदर्भ अगर आप चाहते हैं पर यह स्थापित करने के लिए सक्षम होना चाहिए

<camelContext> 
    <properties> 
     <property key="http.keepAlive" value="false"/> 
    </properties> 
</camelContext> 

ध्यान दें कि मैंने कोशिश नहीं की है। यदि आप इसे काम करते हैं, तो परिणाम सुनना अच्छा लगेगा!

+0

बहुत खराब, यह पता करने की कोशिश की, लेकिन यह कोई असर नहीं लगता था ... एक तरह से ऊंट आवेदन बताने के लिए होनी चाहिए कि सभी आवश्यक जानकारी प्राप्त की गई है और इसलिए टीसीपी कनेक्शन बंद किया जा सकता है, है ना? – opstalj

+0

इसे सिस्टम प्रॉपर्टी के रूप में सेट करने का प्रयास करें। जावा में HTTP4 क्लाइंट को इसे चुनना चाहिए। –

+0

क्या यह अंतर हो सकता है: मैं सादा का उपयोग कर रहा हूंHTTP घटक और HTTP4 एक नहीं ...? – opstalj

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