2011-11-10 13 views
5

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

आमतौर पर, एक सुंदर अवरुद्ध फैशन में लंबे पूलिंग फ़ंक्शन, जहां वर्तमान धागा भंग नहीं होता है, जो समवर्ती कनेक्शन के संदर्भ में सर्वर-साइड ऐप की स्केलेबिलिटी को कम करता है।

+2

क्या आपने सर्वलेट 3.0 और यह असिंक्रोनस सर्वलेट का प्रयास किया था? http://download.oracle.com/javaee/6/api/javax/servlet/annotation/WebServlet.html#asyncSupported%28%29 यह आपके धागे को पूल में वापस कर देगा, लेकिन कुछ दीर्घकालिक संचालन को संसाधित करने की अनुमति देगा और उपयोगकर्ता का अनुरोध –

उत्तर

2

हां, Servlet spec ver का उपयोग करना संभव है। 3.0। कार्यान्वयन मैं जेटी सर्वर की सिफारिश कर सकते हैं। here देखें। (परीक्षण नहीं)

5

हाँ, आप सर्वलेट 3.0

नीचे साथ ऐसा कर सकते नमूना चेतावनी हर 30 सेकेंड में लिखने के लिए है।

@WebServlet(async =“true”) 
public class AsyncServlet extends HttpServlet { 

Timer timer = new Timer("ClientNotifier"); 

public void doGet(HttpServletRequest req, HttpServletResponse res) { 

    AsyncContext aCtx = request.startAsync(req, res); 
    // Suspend request for 30 Secs 
    timer.schedule(new TimerTask(aCtx) { 

     public void run() { 
      try{ 
        //read unread alerts count 
       int unreadAlertCount = alertManager.getUnreadAlerts(username); 
        // write unread alerts count 
    response.write(unreadAlertCount); 
      } 
      catch(Exception e){ 
       aCtx.complete(); 
      } 
     } 
    }, 30000); 
} 
} 

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

@WebServlet(async=“true”) 
public class AsyncServlet extends HttpServlet { 
public void doGet(HttpServletRequest req, HttpServletResponse res) { 
     final AsyncContext asyncCtx = request.startAsync(req, res); 
     alertManager.register(new AlertNotificationHandler() { 
        public void onNewAlert() { // Notified on new alerts 
         try { 
           int unreadAlertCount = 
             alertManager.getUnreadAlerts(); 
           ServletResponse response = asyncCtx.getResponse(); 
           writeResponse(response, unreadAlertCount); 
           // Write unread alerts count 
         } catch (Exception ex) { 
           asyncCtx.complete(); 
           // Closes the response 
         } 
        } 
     }); 
    } 
} 
+1

पढ़ें यदि उपयोगकर्ता पृष्ठ पर जाता है, और async ऑब्जेक्ट बनाया जाता है, लेकिन फिर वे पृष्ठ को रीफ्रेश करते हैं? एक और वस्तु बनाई गई है? और अब दो अनुरोध वापस भेजे जाएंगे? या क्या होगा यदि वे पृष्ठ से दूर नेविगेट करते हैं? क्या प्रतिक्रिया बाहरी अंतरिक्ष में भेजी जाएगी? क्षमा करें मुझे इसके चारों ओर अपने सिर लपेटने में परेशानी हो रही है! – gmustudent

+0

और आपके पहले उदाहरण में आपके पास एक विधि है() एक और विधि के अंदर doGet()। यह मेरे लिए नया है। क्या आपको इसे इस तरह से करना है या क्या आप विधियों को अलग कर सकते हैं? और क्या इसे रन कहा जाना चाहिए? – gmustudent

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