2012-04-01 15 views
5

कुछ अजीब स्थिति में प्रकट होता है। वेब एप्लिकेशन (युद्ध) के प्रदर्शन परीक्षण के दौरान, क्लाइंट अनुरोधों के लगभग 2% पर 500 प्राप्त करता है। जब अनुप्रयोग लॉग खोज, वहाँ कुछ अपवाद हैं:टॉमकैट के localhost_access लॉग में गुम त्रुटि अनुरोध, जबकि जैक्सन आमंत्रण के दौरान IOException अनुप्रयोग लॉग

java.io.IOException: Stream closed 
    at org.apache.catalina.connector.InputBuffer.read(InputBuffer.java:394) 
    at org.apache.catalina.connector.CoyoteReader.read(CoyoteReader.java:110) 
    at org.codehaus.jackson.impl.ReaderBasedParserBase.loadMore(ReaderBasedParserBase.java:95) 
    at org.codehaus.jackson.impl.ReaderBasedParser._skipWSOrEnd(ReaderBasedParser.java:935) 
    at org.codehaus.jackson.impl.ReaderBasedParser.nextToken(ReaderBasedParser.java:245) 
    at org.codehaus.jackson.map.ObjectMapper._initForReading(ObjectMapper.java:2432) 
    at org.codehaus.jackson.map.ObjectMapper._readMapAndClose(ObjectMapper.java:2389) 
    at org.codehaus.jackson.map.ObjectMapper.readValue(ObjectMapper.java:1618) 
    at MyServlet.doPost(MyServlet.java:25) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:641) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:722) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
    at MyFilter.doFilter(MyFilter.java:67) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
    at MyFilter.doFilter(MyFilter.java:28) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169) 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100) 
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:929) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:405) 
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:964) 
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:515) 
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:304) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) 
    at java.lang.Thread.run(Thread.java:662) 

हालांकि, localhost_access खाली है और सभी अनुरोधों को वहाँ 200 स्थिति कोड के लिए है। जबकि ग्राहक उन्हें हो रही है,

  • हो कैसे सकता है कि localhost_access लॉग 500 अनुरोधों याद आ रही है:

    मैं इस समस्या पर कोई अंतर्दृष्टि सराहना करेंगे। जब यह सब होता है?

  • क्यों java.io.IOException केवल कभी-कभी फेंक दिया जाता है (अनुरोधों के कम से कम 2%)?

अद्यतन 1: बिलाव 7.0.22 और जावा 6 के साथ समस्या तब होती है

अद्यतन 2: यहाँ, (एक स्थिर HTML फाइल करने के लिए कुछ नमूना अनुरोध भी नहीं एक सर्वलेट है, इसलिए वहाँ

Response headers: 
HTTP/1.1 500 Internal Server Error 
Server: Apache-Coyote/1.1 
Content-Type: text/html;charset=utf-8 
Transfer-Encoding: chunked 
Date: Mon, 02 Apr 2012 07:35:06 GMT 
Connection: close 

अद्यतन 3: नेटवर्क मैं स्थानीय होस्ट पर एक ही परीक्षण भागा खत्म करने के लिए लॉग और localhost_access में कुछ भी नहीं में भी इसका अपवाद नहीं है)। यह परीक्षण परिणामों को प्रभावित नहीं करता है। तो यह नेटवर्क नहीं है।

अपडेट 4: टॉमकैट को पुनरारंभ करने में मदद मिली। और फिर भी मुझे समझ में नहीं आता कि मूल समस्या क्या हुई।

अद्यतन 5: टोमकैट 7.0.26 तक अपग्रेड किया गया, लेकिन इसने समस्या को हल नहीं किया।

अपडेट 6: जेटी में ले जाया गया। त्रुटियां चली गई हैं। क्या मुझे इन सभी वर्षों के बाद टोमकैट को "अलविदा" कहना चाहिए?

+0

क्या इन त्रुटियों में से किसी एक के लिए पूर्ण स्टैक ट्रेस के ऊपर उद्धृत स्टैक ट्रेस है? यदि नहीं, तो क्या आप पूर्ण स्टैक ट्रेस प्रदान कर सकते हैं। –

+0

पूर्ण स्टैकट्रस जोड़ा गया। मैंने MyServlet और MyFilter के साथ हमारे कस्टम क्लासेस को बदल दिया। – Tarlog

+0

कोई भी मौका आपके फ़िल्टर को अनुरोध के संदर्भ को बनाए रखने और किसी मौजूदा अनुरोध के बजाय पिछले अनुरोध से जुड़े अनुरोध ऑब्जेक्ट का उपयोग कर रहा है? –

उत्तर

5

आप यह नहीं कहते कि टॉमकैट का कौन सा संस्करण आप चल रहे हैं जो एक बड़ी मदद होगी। मेरा अनुमान - जो आप देखते हैं उसके आधार पर - यह अपेक्षाकृत पुराना है।
एक्सेस लॉग को वाल्व के रूप में लागू किया गया है। अगर वाल्व तक पहुंचने से पहले अनुरोध अस्वीकार कर दिया जाता है तो यह एक्सेस लॉग में कभी नहीं दिखाई देगा। यह आमतौर पर तब होता है जब अनुरोध विकृत होता है लेकिन अन्य परिस्थितियां होती हैं जो इसे ट्रिगर कर सकती हैं।
टोमकैट 6.0.30 (और सभी 7.0.x संस्करणों) के रूप में एक्सेस लॉगिंग तंत्र को यह सुनिश्चित करने के लिए दोबारा लिखा गया था कि एक्सेस लॉग पर संदेश लिखे गए हैं, भले ही अनुरोध AccessLogValve तक पहुंचने से पहले अस्वीकार कर दिया गया हो।

क्लाइंट कनेक्शन बंद होने पर IOException फेंक दिया जाता है। चाहे वह 500 की वजह से हो या 500 कारणों से प्रदान की गई जानकारी से अस्पष्ट है।

+0

यह टॉमकैट 7.0.22 है (बीटीडब्ल्यू, मैंने टॉमकैट 7 टैग रखा है, लेकिन शायद आपको सही है कि मुझे इसे स्पष्ट रूप से लिखना चाहिए) – Tarlog

+0

"क्लाइंट कनेक्शन बंद होने पर IOException फेंक दिया गया है"। इस मामले में ग्राहक को टोमकैट से 500 मिलेगा? काफी अस्पष्ट – Tarlog

4

त्रुटि संदेश से पता चलता है कि IOException सही है जब जैक्सन पार्सिंग शुरू करने का प्रयास करता है, जिसका अर्थ है कि पार्सल अनुरोध शुरू करते समय अंतर्निहित HTTP कनेक्शन पहले ही बंद हो गया है। तो कुछ कनेक्शन बंद कर दिया है; और यह क्लाइंट के साथ-साथ सर्वर भी हो सकता है (HTTP दोनों सिरों को किसी भी बिंदु पर कनेक्शन बंद करने की अनुमति देता है), यह अक्सर मध्य में कुछ होता है (फ़ायरवॉल, प्रॉक्सी, लोडबलैंसर); अक्सर किसी तरह के टाइमआउट के कारण।

+0

हाँ, मेरा पहला अनुमान है कि यह एक लोडबैंसर था। लेकिन टॉमकैट से कनेक्ट करने से सीधे एक ही त्रुटि उत्पन्न हुई। मेरी भावना अभी भी है कि यह "नेटवर्क से संबंधित" है, लेकिन मुझे नहीं पता कि इसे कैसे संबोधित किया जाए। – Tarlog

+0

स्थानीयहोस्ट पर परीक्षण किया गया। वही त्रुटि पुन: उत्पन्न की गई थी। तो यह नेटवर्क से संबंधित नहीं है। यह टोमकैट है। – Tarlog

+0

एक चीज जो आप कर सकते हैं केवल किसी भी सामग्री को प्राप्त करने के मामले को संभालने के लिए पहले इनपुट (या यह सब) इनपुट को थोड़ा सा पढ़ना है; और यदि आप सामग्री को बफर करते हैं, तो केवल जैक्सन को पास करें। इस तरह आप कम से कम बेहतर त्रुटि संदेश प्रदान कर सकते हैं। बेशक आप यह भी जानना चाहते हैं कि ऐसा क्यों होता है, लेकिन बेहतर विफलता संदेश भी प्रदान करना समझ में आता है? – StaxMan

1

आईई पर AJAX पोस्ट में असफल विफलता समस्याएं हैं। हमने sockettimeoutexceptions देखा है। आप KeepAlive को अक्षम कर सकते हैं और 'कनेक्शन: क्लोज़' हेडर का उपयोग कर AJAX POST के लिए KeepAlive को अक्षम या अक्षम कर सकते हैं। किसी भी बॉडी अनुरोध के लिए ट्यून अपाचे अनुरोधreadtimeout।

+0

ठीक है, तब से मैं जेटी चले गए। यह बहुत बेहतर है। – Tarlog