2012-05-11 21 views
6

काम नहीं कर रहा मैं बड़ी वस्तुओं स्ट्रीमिंग के लिए एक सर्वलेट को लागू करने की कोशिश कर रहा हूँ:response.flushBuffer()

oracle.sql.BLOB blob = rs.getBLOB('obj'); 
    InputStream in = blob.getBinaryStream(); 

    int bufferSize = 1024; 
    byte[] buffer = new byte[bufferSize]; 

    ServletOutputStream out = response.getOutputStream(); 

    int counter=0 
    while((length=in.read(buffer)) != -1){ 
     out.write(buffer,0,length); 
     counter++; 
     if(counter % 10 == 0){ 
     counter=0; 
     response.flushBuffer(); 
    } 

chunck द्वारा ग्राहक हिस्सा करने के लिए डेटा भेजने के लिए लगता है कि यह कोड। अब क्या हो रहा है कि जब मैं बड़ी वस्तु (100 एमबी) स्ट्रीम करता हूं, तो स्मृति बढ़ जाती है, और सर्वर एक बार समानांतर डाउनलोड/स्ट्रीम होने पर मर जाता है।

यह flushBuffer() क्लाइंट को डेटा क्यों नहीं भेज रहा है? प्रतिक्रिया बंद होने के बाद ही ग्राहक को खुली/सहेजने वाली फ़ाइल के लिए पॉपअप मिलता है।

+0

इसके अलावा मैं इस कोड – Madhu

+0

के परीक्षण के लिए JOBSS 4.3 Sever का उपयोग क्या आप कहीं बाहर हैं। बंद() '? – Osw

+0

हाँ मैं बाहर करता हूं। बंद करें() लेकिन यहां चिपकाया नहीं गया – Madhu

उत्तर

3

आपको डेटा लिखने से पहले Content-Length शीर्षलेख सेट करना होगा, या स्ट्रीम को बंद होने तक सर्वर को सभी डेटा बफर करने के लिए मजबूर होना पड़ता है, जिस बिंदु पर यह मान की गणना कर सकता है, हेडर लिख सकता है, और सभी को भेज सकता है डेटा। ,

response.setHeader("Content-Length", String.valueOf(blob.length())); 

अधिकांश सर्वर बहुत चालाक इस बिंदु पर खुद को बफ़र फ्लश करने के लिए कर रहे हैं तो आप शायद भी नहीं है: जैसे ही आप उत्पादन स्ट्रीम प्राप्त के रूप में, इससे पहले कि आप कोई भी डेटा लिखते हैं, सामग्री की लंबाई सेट flushBuffer() पर कॉल करने की आवश्यकता है - हालांकि यह चोट नहीं पहुंचाता है।

+1

मैंने इसे थक दिया। यह नहीं दिख रहा है :-) – Madhu

+0

आपकी वरीयता के आधार पर, आप 'प्रतिक्रिया.सेटकंटेंट लम्बाई (blob.length()) भी कर सकते हैं; ' – Stuporman

1

सबसे पहले, आप कितने बाइट्स जानकारी अंत कर सकते हैं के बाद servlet प्रतिक्रिया के लिए एक प्रतिक्रिया हेडर की जरूरत है ताकि कंटेनर पता कर सकते हैं:

response.setHeader("Content-Length", String.valueOf(blob.length()));