2011-08-22 14 views
33

मेरे वेब एप्लिकेशन में कुछ अनुरोध हैं जो 20 सेकंड से अधिक समय तक चलते हैं। लेकिन कुछ स्थितियों में कोड अनंत लूप या कुछ ऐसा ही हो सकता है जो सर्वर को धीमा कर देता है।टॉमकैट अनुरोध टाइमआउट

मैं सर्वर पक्ष पर 60 सेकंड के लिए अनुरोध टाइमआउट देना चाहता हूं। क्या यह टोमकैट में लागू किया गया है?

धन्यवाद, Horatiu

+0

आप 'Socket' और' ServerSocket' उपयोग कर रहे हैं का उपयोग करें? क्योंकि यदि आप हैं, तो आप 'SetSoTimeout' विधि के साथ टाइमआउट सेट कर सकते हैं। –

+0

बस सादे टोमकैट –

+0

@ ईरान, वह वेब एप्लिकेशन विकसित कर रहा है। वह टोमकैट द्वारा खोला गया सर्वर सॉकेट स्वीकार नहीं कर सकता है। – AlexR

उत्तर

37

टॉमकैट 7 के साथ, आप StuckThreadDetectionValve जोड़ सकते हैं जो आपको "अटक" वाले धागे की पहचान करने में सक्षम बनाएगा।आप सेट अप कर सकते हैं आवेदनों की संदर्भ तत्व में वाल्व जहां पता लगाने क्या करना चाहते हैं:

<Context ...> 
    ... 
    <Valve 
    className="org.apache.catalina.valves.StuckThreadDetectionValve" 
    threshold="60" /> 
    ... 
</Context> 

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

source code के आधार पर आप अपना खुद का वाल्व लिखने में सक्षम हो सकते हैं जो थ्रेड को रोकने का प्रयास करता है, हालांकि यह थ्रेड पूल पर प्रभाव डालता है और no reliable way जावा के थ्रेड को रोकने के बिना धागा ...

+1

उस थ्रेड को मारने के बजाय (जो आपने उल्लेख किया है विश्वसनीय नहीं है), रनटाइसेप्शन को फेंकना पर्याप्त है –

9

आप server.xml

<Connector URIEncoding="UTF-8" 
    acceptCount="100" 
    connectionTimeout="20000" 
    disableUploadTimeout="true" 
    enableLookups="false" 
    maxHttpHeaderSize="8192" 
    maxSpareThreads="75" 
    maxThreads="150" 
    minSpareThreads="25" 
    port="7777" 
    redirectPort="8443"/> 
+0

क्या मेरे आवेदन को प्रभावित करने का कोई तरीका है? –

+1

दुर्भाग्यवश आप सर्वर से टाइमआउट को प्रभावित नहीं कर सकते हैं AFAIK मैं गलत हो सकता है – Chris

+6

कनेक्शन टाइमआउट यह है कि कनेक्शन स्थापित होने के बाद टोमकैट http अनुरोध लाइन के लिए कितना समय इंतजार करेगा। यह प्रभावित नहीं करता है कि सर्वर – Dave

19

में डिफ़ॉल्ट समय बाहर सेट कर सकते हैं आप बहुत लंबा चल रहा है, तो एक समय-समाप्ति सेट से एक अनुरोध को रोकने के लिए कोशिश कर रहे हैं टॉमकैट आपकी मदद नहीं करेगा। जैसा कि क्रिस कहते हैं, आप टॉमकैट के लिए वैश्विक टाइमआउट मान सेट कर सकते हैं। लेकिन, The Apache Tomcat Connector - Generic HowTo Timeouts से, उत्तर टाइमआउट अनुभाग देखें:

जेके अनुरोध उत्तरों पर टाइमआउट का भी उपयोग कर सकता है। यह टाइमआउट प्रतिक्रिया के पूर्ण प्रसंस्करण समय को मापता नहीं है। इसके बजाय यह नियंत्रित करता है, लगातार प्रतिक्रिया पैकेट के बीच कितना समय की अनुमति है।

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

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

तो बिलाव की पहचान करेगा कि सर्वलेट टाइमआउट के भीतर जवाब नहीं दिया है और उपयोगकर्ता, के लिए एक प्रतिक्रिया वापस भेज देंगे लेकिन धागा जारी रहेंगे। मुझे नहीं लगता कि आप जो हासिल करना चाहते हैं उसे प्राप्त कर सकते हैं।

+0

शायद jboss में? Google ऐप इंजन ने यह किया है, 30 सेकंड या –

+3

की तरह कुछ लिंक पुराना है – rouan

1

यह आलेख सर्वर स्तर पर टाइमआउट सेट करने के बारे में बात करता है। http://www.coderanch.com/t/364207/Servlets/java/Servlet-Timeout-two-ways

एप्लिकेशन को अनंत लूप में जाने का कारण क्या है? यदि आप अन्य संसाधनों के लिए कनेक्शन खोल रहे हैं, तो हो सकता है कि आप उन कनेक्शनों पर टाइमआउट डालें और उस समय बाहर होने पर उचित प्रतिक्रिया भेजना चाहें।

+0

इस पर कोई मार्कडाउन क्यों है? उत्तर वहां पोस्ट किए गए प्रश्न के लिए प्रासंगिक है। – thcricketfan

+4

मुझे लगता है कि यह वोट दिया गया था क्योंकि आलेख लगभग ** सत्र ** टाइमआउट –

-6

बिल्ला ग्रहण

ग्रहण में, बिल्ला सर्वर, डबल क्लिक करें "स्थानीय होस्ट पर बिलाव v7.0 सर्वर" के रूप में के रूप में बाहर समय सेटिंग्स 45 जो कुछ सेकंड आप की तरह करने के लिए में दिखाया गया है जोड़े, गुण बदलें

+2

क्या आप सर्वर को समय-समय पर शुरू कर रहे हैं टाइमआउट का अनुरोध करें? –

+0

प्रश्न http अनुरोध टाइमआउट के बारे में बात कर रहा है, न कि प्रारंभ/रोक समय समाप्ति –

-1

किसी भी ऐसे व्यक्ति के लिए जो समाधान समाधान में से कोई भी पसंद नहीं करता मेरे जैसा ऊपर रखा गया है तो आप बस एक टाइमर स्वयं को कार्यान्वित कर सकते हैं और रनटाइम अपवाद फेंक कर अनुरोध निष्पादन को रोक सकते हैं। कुछ नीचे की तरह:

    try 
       { 
        timer.schedule(new TimerTask() { 
         @Override 
         public void run() { 
         timer.cancel(); 
         } 
        }, /* specify time of the requst */ 1000); 
       } 
       catch(Exception e) 
       { 
        throw new RuntimeException("the request is taking longer than usual"); 
       } 

या अधिमानतः जावा अमरूद timeLimiter here

+1

डाउनवोट के लिए है? – george