2013-03-26 1 views
5

ロングポーリングがどのように機能するかについての情報はたくさんありますが(例、これ、およびこれなど)、コードでこれを実装する方法の例はありません。春のlongpollingサンプルコードですか?

基本的に、Apache Tomcatを使用してリクエストを処理するにはどうしたらよいでしょうか?サーバーに新しいメッセージを「長時間ポーリング」する簡単なアプリ(春)を書くにはどうすればよいですか?

この例題は、スケーラビリティ、安全性、または完全性を備えている必要はなく、機能するだけです! 誰かが私にそのようなチュートリアルを与えたり、他の人を参考にしてくれれば幸いです。ここで

答えて

3

は私が...コントローラで

考え出すことができる最も簡単な例である:あなたがセットアップAJAX呼び出しをだろう、とタイムアウトに、

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

ビューでこれを呼び出すだけでこれをもう一度呼びます。長いポーリングのアイデアは、サーバーが応答するまで応答しないということです。

Spring 3.2を使用している場合は、DeferredResult を使用するか、ハンドラメソッドからCallableを返す方が良いでしょう。 Spring 3.2より前の人は、Atmosphereのように、Springでうまく動作するようにいくつかのフレームワークを用意しています。クライアントサイドのコーディングを簡単にするJavaScript部品もあります。将来は次のとおりです。ポイントは、既存のanwser、サーブレット3 API(Tomcatの7)に来て新しいものを使用して、よりeffecient「ロングポーリング」変種と春3.2

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

に基づいて

+1

DeferredResultはSpring 3.2で追加されたもので、作成したDeferredResultを別のプロセスに渡すことができます。 CallableはRunnableに似たJavaクラスです。不可能ではないが、個別のプロセスが応答を処理できるようにCallableを実装するのは難しい。 DeferredResultの動作を取得する方法について、かなりまともなブログがあります:http://blog.springsource.org/2012/05/13/spring-mvc-3-2-preview-adding-long-polling-to-an-existing -ウェブアプリケーション/ – CodeChimp

0

将来の結果に "ポインタ"(それを文字通り取得しないでください)。したがって、このリクエストのディスパッチスレッドは、未来が解決されるかどうかにかかわらず、上記のコードを処理した後で一時停止または終了します。未来が解決されると、/スレッドは再接続され、実際の結果(この場合は文字列)を返します。しかし、 "Spring"と考えると、POJOをJSONに変換することもできます。

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

関連する問題