2011-10-26 16 views
5

में वापस कर मैं अपने नियंत्रक जो @Async कार्यवसंत MVC में वापसी @Async विधि परिणाम और अजाक्स ग्राहक

@Async 
public Future<String> getResultFromServer(){ 
    String result = ...... 
    return new AsyncResult<String>(result); 
} 

विधि निष्पादन समय 1o मिनट तक है कार्यान्वित अंदर कुछ विधि है। मुझे केवल क्लाइंट पक्ष में परिणाम लौटने की ज़रूरत है जो AJAX/JQuery का उपयोग करके कनेक्ट किया जाएगा।

मैं नहीं चाहता कि ग्राहक प्रत्येक सर्वर को मेरे सर्वर से अनुरोध करे कि @Async विधि निष्पादित या नहीं। मैं सिर्फ अपना कनेक्शन खोलना चाहता हूं और फिर सर्वर पर "धक्का" परिणाम देना चाहता हूं।

@RequestMapping(value="/async.do", method=RequestMethod.POST) 
public void getResult(HttpServletResponse res){ 
    String result = null; 
    PrintWriter out = res.getWriter(); 
    Future<String> future = getResultFromServer(); 
    try { 
     if (future.isDone()) 
      result = future.get(); 
     out.println(result); 
     out.close(); 
    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    } catch (ExecutionException e) { 
     e.printStackTrace(); 
    } 
} 

मैं समझता हूं कि यह कॉमिट मॉडल के बहुत करीब है, लेकिन मैं आम तौर पर धूमकेतु से परिचित नहीं हूं।

मेरा सवाल यह है कि मैं जावास्क्रिप्ट/JQuery का उपयोग कर क्लाइंट साइड पर कनेक्शन कैसे खोल सकता हूं?

और क्या मेरे @RequestMapping(value="/async.do", method=RequestMethod.POST) क्लाइंट को विधि पुश परिणाम मिलेगा?

+1

आपने अंततः इस भाग 2 को कैसे हल किया? – happybuddha

उत्तर

2

सबसे आसान तरीका एक अतुल्यकालिक तरीके से विधि का आह्वान नहीं करना होगा, इसके बजाय इसे सीधे सिंक्रोनस तरीके से नियंत्रक से बुलाएं।

फिर विधि के परिणाम की गणना होने तक अनुरोध को "प्रतीक्षा" करने की आवश्यकता होगी, और इसे जल्द से जल्द वापस किया जा सकता है।

बेशक इसका मतलब यह है कि यह कनेक्शन खुलेगा कि यह कितना समय लगता है (1 मिनट)।

+0

उत्तर के लिए धन्यवाद और विधि को सीधे निष्पादित करने के विचार के लिए, मुझे एक और चिंता है: जहां तक ​​मैं समझता हूं, टोमकैट मेरे अनुरोध को अलग थ्रेड में प्राप्त करता है जो मेरे HTTP कनेक्शन के लिए खुलता है। क्या इसका मतलब यह है कि अगर मेरा अनुरोध 15 मिनट तक बढ़ता है तो उस समय टॉमकैट थ्रेड चल जाएगा? क्या इसका मतलब यह है कि इस ऑपरेशन के लिए अनुरोध के लिए 2 थ्रेड एक और Async कार्य के लिए दूसरा आवश्यक है? पहले थ्रेड को निलंबित करने का कोई तरीका है जबकि दूसरा थ्रेड (एसिंक कार्य) निष्पादित किया गया है? –

+0

यदि आप 'async' का उपयोग करते हैं तो आपके पास दो धागे हैं, जो कि '@ async' द्वारा लिखित विधि को आमंत्रित करता है और तत्काल लौटाता है, और दूसरा जो वास्तव में' @ async' विधि में सामान कर रहा है। पहले धागे को निलंबित करने के लिए, बस भविष्य को आमंत्रित करें .get(), यह परिणाम तब तक धागा को अवरुद्ध करता है जब तक परिणाम न हो। लेकिन यदि आप ऐसा करते हैं: 'as ascc' का आह्वान करें और वार्ड के बाद सीधे future.get() को कॉल करें, तो पूर्ण '@ ascync' सामान बेकार है, क्योंकि आप बहुत तकनीकी के साथ एक विधि आमंत्रण के सामान्य व्यवहार को सिमुलेट करते हैं सामान। – Ralph

+0

@ danny.lesnik: लेकिन अगर आपकी गणना में 15 मिनट लगेंगे, तो आपको इस समय अवधि के लिए कनेक्शन रखने की तुलना में वास्तव में एक अन्य समाधान की आवश्यकता है! – Ralph

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