5

ロング ポーリングがどのように機能するかについては多くの情報を見つけることができますが (たとえば、これとこれ)、これをコードに実装する方法の簡単な例はありません。

基本的に、Apache Tomcat を使用してリクエストを処理するにはどうすればよいでしょうか。また、新しいメッセージのためにサーバーを「ロングポーリング」する単純なアプリ ( spring ) をどのように作成すればよいでしょうか?

この例は、拡張可能、安全、または完全である必要はありません。機能する必要があるだけです! 誰かが私にそのようなチュートリアルを提供したり、他の人を参照したりしていただければ幸いです。

4

2 に答える 2

3

これが私が思いつく最も簡単な例です...

コントローラーで:

@RequestMapping("/longPolling")
public String longPolling(Model model) {
  while(true) {
    // .. Do something, break when done...
    if( somethingIsDone ) {
       break;
    }
  }
  return "someResponse";
}

これを呼び出すビューでは、ajax 呼び出しをセットアップし、タイムアウト時にこれを再度呼び出すだけです。ロング ポーリングの考え方は、サーバーは応答するものがあるまで応答しないというものです。

Spring 3.2 を使用している場合のより良いアプローチは、DeferredResultを使用する か、ハンドラー メソッドから Callable を返すことです。Spring 3.2 より前の場合は、Atmosphere のように、Spring で問題なく動作するフレームワークがいくつかあります。クライアント側のコーディングを容易にする JavaScript 部分を備えているものもあります。

于 2013-03-26T11:28:31.663 に答える
0

サーブレット 3 API (Tomcat 7) および Spring 3.2 に付属する新しい機能を使用した、既存の anwser に基づく、より効率的な「ロング ポーリング」バリアント

@RequestMapping("/longPolling")
public Future<String> longPolling(Model model) {
  return callSomethingWhereAFutureReturns();
}

ポイントは、未来は未来の結果への「ポインター」にすぎない (文字通りに取得しないでください) ということです。したがって、このリクエストのディスパッチ スレッドは、将来がいつ解決されるかに関係なく、上記のコードを処理した後に中断/終了します。future が解決されると、スレッドが再接続され、実際の結果 (この場合は文字列) が返されます。しかし、「Spring」を考えてみてください。これは、JSON に変換された POJO である可能性もあります。

これは、将来の結果が別のスレッドによって解決される場合にのみ意味があります。チャット アプリケーションでは、これは新しいメッセージ (推奨されません) または専用のディスパッチャー スレッド (より良い) を伴う別の要求スレッドになります。

于 2013-05-08T19:03:51.040 に答える