2012-07-05 12 views
6

से टेक्स्ट प्रतिक्रिया स्ट्रीम करने के लिए कैसे करें मैं ऑपरेशन की प्रगति दिखाने के लिए ब्राउज़र पर पृष्ठ पर टेक्स्ट आउटपुट कैसे स्ट्रीम कर सकता हूं जिसमें लगभग 15-20 सेकंड लग सकते हैं? मैंने HttpServletResponse की आउटपुट स्ट्रीम को सीधे लिखने की कोशिश की है, लेकिन उपयोगकर्ता अभी भी पूर्ण आउटपुट के बाद पूरी प्रक्रिया समाप्त हो गया है।जावा स्प्रिंग एमवीसी 3.0 वेबैप

यह वही है मैं अब तक की कोशिश की है

@RequestMapping(value = "/test") 
public void test(HttpServletResponse response) 
      throws IOException, InterruptedException { 
    response.getOutputStream().println("Hello"); 
    response.getOutputStream().flush(); 
    Thread.sleep(2000); 
    response.getOutputStream().println("How"); 
    response.getOutputStream().flush(); 
    Thread.sleep(2000); 
    response.getOutputStream().println("are"); 
    response.getOutputStream().flush(); 
    Thread.sleep(2000); 
    response.getOutputStream().println("you"); 
    response.getOutputStream().flush(); 
} 
+0

क्या आपने डेटा के प्रत्येक चक भेजे जाने के बाद आउटपुटस्ट्रीम को फ्लश करने का प्रयास किया है? – Luciano

+0

@ लुइसियानो मैंने जो जोड़ा है, मैंने अभी तक सवाल उठाया है। जब मैं क्रोम – Danish

+0

से पृष्ठ देखता हूं तो यह काम नहीं करता है, मुझे लगता है कि आपकी सर्वश्रेष्ठ शर्त एक अलग दृष्टिकोण होगी: जावास्क्रिप्ट में टाइमर का उपयोग करें जो डेटा को प्रत्येक 1 सेकंड (या आधे सेकेंड) से डेटा लेता है, AJAX का उपयोग करके, और/परीक्षण वापस लौटाएगा जो उस बिंदु तक पहले भेजा गया था जिसे इसे बुलाया गया था। – Luciano

उत्तर

1

मैं कोई स्प्रिंग एमवीसी विशेषज्ञ नहीं हूं, लेकिन मुझे लगता है कि आप "स्वीकृत" के 202 प्रतिक्रिया कोड भेजने की तरह कुछ करेंगे, जो इंगित करता है कि सर्वर को अनुरोध प्राप्त हुआ है और कुछ एसिंक्रोनस प्रोसेसिंग करने जा रहा है। आम तौर पर, सर्वर एक यूआरएल प्रदान करता है ताकि ग्राहक ऑपरेशन की स्थिति के बारे में अनुरोध जारी कर सके। आप जो करने का प्रयास कर रहे हैं वह सर्वर/क्लाइंट रिलेशनशिप के सामान्य तरीके से उल्लंघन करता है। क्लाइंट सर्वर को कॉल करता है, और सर्वर प्रतिसाद देता है और फिर कनेक्शन बंद हो जाता है। आप किस संदर्भ में ऐसा करने की कोशिश कर रहे हैं और किस कारण से? शायद मैं कुछ और अंतर्दृष्टि प्रदान कर सकता हूं या ऐसा करने का एक और तरीका सोच सकता हूं?

+2

आपकी रुचि के लिए धन्यवाद! असल में, मैं उपयोगकर्ता को नौकरी निष्पादन का अनुरोध करने की क्षमता प्रदान करना चाहता हूं, प्रगति की निगरानी करने में सक्षम होना चाहिए और नौकरी खत्म होने के बाद उसका विचार अपडेट हो सकता है। मैं देख सकता हूं कि नौकरी निष्पादक एसिंक बनाकर और 'सत्र' में कुछ राज्यों को बनाए रखने और यूआई से मतदान करके यह कैसे किया जा सकता है। * हालांकि * अगर मेरे प्रश्न का वैध उत्तर है, तो मैं इसे एसिंक निष्पादक और राज्य प्रबंधन के बिना किया जा सकता हूं। – Danish

+0

मुझे लगता है कि सर्वर के लिए क्लाइंट से संपर्क करने के लिए आप क्या पूछ रहे हैं, और असंभव नहीं होने पर, यह बेहद अनियमित होगा। स्पष्ट रूप से चंकित मात्रा में ग्राहक को वापस भेजने के लिए मार्ग हैं (जैसे एफ़टीपी), लेकिन दुर्भाग्यवश, मुझे पता है कि क्या आप जो करना चाहते हैं उसके लिए लागू है, और न ही मुझे पता है कि स्प्रिंग एमवीसी के साथ यह संभव है या नहीं। सौभाग्य! – thatidiotguy

+0

धन्यवाद! मैं शायद मतदान पद्धति के साथ जाऊंगा जिसे आपने और अन्य ने अभी उल्लेख किया है और इस प्रश्न को समय के लिए खुला रखा है।मुझे बस सभी संभावनाओं की खोज करना अच्छा लगता है। चीयर्स! – Danish

-4
@Controller 
public class MyController{ 

    @RequestMapping(value = "/test", method = RequestMethod.GET) 
    public @ResponseBody String getTest() { 
     return "hello how are you"; 
    } 
} 

आप वसंत नियंत्रक उपयोग कर रहे हैं आप प्रतिक्रिया शरीर टिप्पणी के साथ ऊपर कर सकता है।

+1

आंशिक प्रगति आउटपुट की समस्या को कैसे हल करता है? –

+0

@ सेनपैट्रिकफ्लॉइड ओह ठीक है, मैंने उस बिट को नहीं देखा/पढ़ा नहीं है। थोड़ा कठिन है ... सुनिश्चित नहीं है – NimChimpsky

1

इस्तेमाल करने की कोशिश:

response.flushBuffer(); 

JavaDoc के रूप में कहते हैं:

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

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