2

ブラウザーの互換性の問題のため、リアルタイムの同期および通知システムにロング ポーリングを使用することにしました。私はバックエンドで Java を使用しており、これまでに見つけた例はすべて PHP でした。while ループと sleep メソッドを使用する傾向があります。この種のものを Java で複製するにはどうすればよいですか? 私を導く方法がありThread.sleep()ます...ポーリングを発行するユーザーごとに個別のスレッドを使用する必要がありますか? 別のスレッドを使用しない場合、ポーリング要求によってサーバーがブロックされますか?

4

2 に答える 2

4

[更新]まず第一に、はい、簡単で長いポーリング要求ハンドラーを実行することは確かに可能です。リクエストはサーバーに届き、ハンドラーで必要な情報が利用可能になるまでループまたはブロックし、ループを終了して情報を提供します。長いポーリングクライアントごとに、はい、スレッドを拘束することになります。これは問題ないかもしれません、そしておそらくこれはあなたが始めるべき方法です。ただし、Webサーバーの人気が高まり、ブロックスレッドの数がパフォーマンスの問題になっている場合は、多数のクライアントリクエストを保留できる非同期ソリューションを検討してください。リクエストはブロックされており、そこまで応答しません。クライアントごとに1つ以上のスレッドを拘束することなく、有用なデータです。

[オリジナル]

サーブレット3.0仕様は、この種の非同期処理を行うための標準を提供します。Google「サーブレット3.0非同期」。Tomcat7はこれをサポートしています。Jettyもそうだと思いますが、使ったことはありません。

基本的に、サーブレットリクエストハンドラでは、「長い」ポーリングを実行する必要があることに気付いたときに、メソッドを呼び出して非同期コンテキストを作成できます。次に、リクエストハンドラを終了すると、スレッドが解放されますが、クライアントは引き続きリクエストをブロックしています。寝たり待ったりする必要はありません。

秘訣は、非同期コンテキストを「便利な」場所に保存することです。次に、アプリで何かが発生し、データをクライアントにプッシュしたい場合は、そのコンテキストを見つけて、そこから応答オブジェクトを取得し、コンテンツを書き込んで、completeを呼び出します。クライアントごとにスレッドを拘束することなく、応答がクライアントに返送されます。

于 2012-10-10T19:28:03.067 に答える
1

これが目的に最適なソリューションかどうかはわかりませんが、通常、Javaで期間間隔でこれを実行する場合は、ScheduleExecutorServiceを使用します。APIドキュメントの上部に良い例があります。TimeUnitは、期間を簡単かつ明確に指定できる優れた列挙型です。したがって、x分、時間などごとに実行するように指定できます

于 2012-10-10T19:09:56.203 に答える