2011-03-04 12 views
5

यह है कि मैं जेट्टी के लिए तैनात किए गए सर्वलेट का कोड है:जेट्टी सर्वलेट है कि ग्राहक पता नहीं लगा पाया डिस्कनेक्ट कर दिया गया

public class StreamServlet extends HttpServlet 
{ 
    public void doGet(HttpServletRequest request, 
    HttpServletResponse response) throws ServletException, IOException 
    { 
    response.setContentType("text/xml; charset=UTF-8"); 
    response.setCharacterEncoding("UTF-8"); 

    InputStream is = this.getServletContext().getResourceAsStream("A.xml"); 
    BufferedReader reader = new BufferedReader( 
     new InputStreamReader(is, Charset.forName("UTF-8"))); 

    String line = ""; 
    try 
    { 
     while((line = reader.readLine()) != null) { 
     getServletContext().log(line); 
     writer.println(line); 
     writer.flush(); 
     Thread.sleep(1500); // for testing 
     } 
    } 
    catch (InterruptedException e) 
    { 
     getServletContext().log("exception",e); 
    } 
    } 
} 

मैं तो कमांड लाइन

curl -i http://localhost:8080/foo/servlet 

फ़ाइल A.xml शामिल पर भाग गया लगभग 13,000 लाइनें; इसलिए कर्ल 1.5 सेकंड के बाद प्राप्त प्रत्येक पंक्ति को सही तरीके से प्रदर्शित करता है। मैंने फिर कर्ल में बाधा डाली, लेकिन मेरे आश्चर्य के लिए सर्वलेट चलने पर जारी रहा; i.e इस दौरान लूप।

while((line = reader.readLine()) != null) { 
    getServletContext().log(line); 
    writer.println(line); 
    writer.flush(); 
    Thread.sleep(1500); // for testing 
} 

यह इस व्यवहार को क्यों प्रदर्शित करता है? मैं निरंतरता का उपयोग नहीं कर रहा हूँ। मैं जेटी 6.1.26 चला रहा हूँ। मैं क्या चाहता हूं: सर्वलेट थ्रेड को रोकना चाहिए जब यह पता लगाता है कि क्लाइंट ने http कनेक्शन को समाप्त कर दिया है।

उत्तर

0

मुझे नहीं पता कि आपको लेखक कहां मिल रहा है, इसलिए मुझे लगता है कि यह प्रतिक्रिया से है .getWriter()।

मुझे लगता है कि हो रहा है कि जेटी क्लाइंट को भेजने से पहले आंतरिक रूप से प्रतिक्रिया को बफर करता है। इसे ऐसा करने की आवश्यकता है क्योंकि इसे प्रतिक्रिया के आकार की गणना करने की आवश्यकता है ताकि यह HTTP प्रतिक्रिया शीर्षलेख में "सामग्री-लंबाई" फ़ील्ड सेट कर सके। क्लाइंट द्वारा इसकी आवश्यकता है ताकि यह जान सके कि कितना पढ़ना है। (ठीक है, यह वास्तव में आवश्यक नहीं है लेकिन यह एक और चर्चा है।)

मुझे लगता है कि जब तक आप लेखक को बंद नहीं कर लेते हैं तो जेटी वास्तव में डेटा नहीं भेजता है। मैं यह भी सोच रहा हूं कि फ्लश() कुछ भी नहीं करता है क्योंकि यह तब तक कोई डेटा नहीं भेज सकता जब तक कि यह नहीं जानता कि अब और नहीं आ रहा है। और यह जांच नहीं कर रहा है कि जब आप इस buffered स्ट्रीम को लिख रहे हैं तो कनेक्शन अभी भी सक्रिय है या नहीं।

अपने पाश के लिए इस प्रयास करें:

for(String line = reader.readLine(); line != null && !writer.checkError(); line = reader.readLine()) { 
    getServletContext().log(line); 
    writer.println(line); 
    writer.flush(); 
    Thread.sleep(1500); // for testing 
} 

मैं शायद सोच रहा हूँ writer.checkError() वास्तविक सॉकेट outputstream और चेक अप करने के लिए प्रसारित करता है, तो यह अभी भी खुला है।

संपादित करें 1: हमम कभी भी ध्यान नहीं देते, मुझे थोड़ा याद आया जहां आपने कहा था कि फ्लश() कर्ल को डेटा भेज रहा है। फिर भी, अपने लूप में checkError() आज़माएं और अगर यह काम करता है तो मुझे बताएं।

0

क्या आपको IOException की अपेक्षा नहीं करनी चाहिए, न केवल इंटरप्टेड अपवाद? क्लाइंट डिस्कनेक्ट होने पर सर्वर IOException प्राप्त करेगा और सर्वर इसे लिखने का प्रयास करता है। है न ? (इंटरप्टेडएक्सप्शन थ्रेड स्लीप पार्ट को संभालता है, हालांकि)।

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

  • कोई संबंधित समस्या नहीं^_^