2011-11-10 12 views
5

HTTPServletRequestをスレッドから離し、このスレッドを解消(つまりプールに戻す)することはできますが、結果が得られるまでブラウザとの接続を維持してください時間のかかる操作(例えば、画像の処理)から戻りデータが処理されるときには、別のメソッドを非同期的に呼び出す必要があり、要求とデータをパラメータとして渡す必要があります。長いポーリングを非同期的に実装する

通常、長いプーリングは、現在のスレッドが解消されないかなりブロック的な方法で機能し、同時接続に関してサーバー側のアプリケーションのスケーラビリティを低下させます。

+2

サーブレット3.0を試してみましたが、それは非同期サーブレットですか? http://download.oracle.com/javaee/6/api/javax/servlet/annotation/WebServlet.html#asyncSupported%28%29スレッドをプールに戻しますが、長期間の操作を処理することができます。ユーザーの要求を読み取る –

答えて

2

はい、サーブレット仕様verを使用することは可能です。 3.0。実装私はJettyサーバーを推奨できます。 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); 
} 
} 

以下は、イベントに基づいて書き込むサンプルです。 AlertNotificationHandlerにクライアントに警告する必要があることを通知するalertManagerを実装する必要があります。

@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

ユーザーがページに行き、非同期オブジェクトが作成された後にページを更新するとどうなりますか?作成された別のオブジェクトですか?そして今、2つのリクエストが返されますか?または、ページから離れて移動する場合はどうなりますか?応答は宇宙空間に送られるのだろうか?申し訳ありませんが、私はこの周りに私の頭をラップするのに問題があります! – gmustudent

+0

最初の例では、別のメソッドdoGet()の中にメソッドrun()があります。それは私にとって初めてのことです。あなたはそれをこのようにしなければならないのですか、それとも方法を分けることができますか?そして、それは実行と呼ばれる必要がありますか? – gmustudent

関連する問題