実際にデータをクライアントにプッシュする API を探しています。現在、これを達成するためにロングポーリングの雰囲気を使用しています。コメットを有効にしてGlassfish 3.1.2を使用しています。
後で、Servlet 3.0 の非同期機能について聞きました。そこで、雰囲気の入れ替えに使えるか試してみました。
アイデアは、リクエストを受信すると、それらをアプリケーションスコープ内のリストに入れるサーブレットを持つことです。その後、無期限に別のリクエストを受け取り、リストを反復処理してクライアントにレスポンスを送信します。
リクエストを受け取り、AsyncContext をアプリケーション スコープのリストに入れる最初のサーブレットを作成しました。次に、AsyncContext が作成されているかどうかを確認しました。実際にURLにヒットするajax呼び出しを書きました。ajax リクエストが 30 秒後にタイムアウト/停止しました。その後、AsyncContext のタイムアウトを設定しようとしましたが、タイムアウトが発生しないように負の値に設定しました。後で、 AsyncContext の setTimeOut(int) は別の目的であることがわかりました。応答を送信するのに何時間または何日かかるかわからないため、タイムアウトを非常に大きく設定することはできません。
次に、リクエストのタイムアウトを無期限に設定することを考えました。しかし、これを行う方法がわかりません。
リクエストを無期限に一時停止する resource.suspend() を使用して、大気中でも同じことが実現できます。
これに Servlet 3.0 の非同期機能を使用できない場合、その目的は何ですか?
この機能について私が理解したのは、リクエストが jdbc 接続などのリソースを待機している場合、リクエストはキューに入れられ、スレッドはスレッド プールに返され、スレッドが他のリクエストに対応できるようになるということです。 . このリンクは実際に非同期プロセスを開始し、オブジェクトを Runnable に渡し、doGet メソッドを終了します。Runnable がリソースを待機しているためにリクエストを処理するのに時間がかかる場合、スレッドはスレッド プールに戻され、リサイクルされます。私の理解は正しいですか?私の理解が正しければ、リクエストがリソースを待機する最大時間を超えると、タイムアウトになり、何らかの例外がクライアントに送信されます。プログラムでタイムアウトを無期限に設定し、大気なしでサーバー側のプッシュを実現する方法。
多くのドキュメントには、非同期サーブレットを使用してデータをクライアントにプッシュできると記載されています。すべてのクライアントがロング ポーリングを使用し、サーバーが非同期をサポートしていない場合は、要求ごとに 1 つのスレッドを割り当てる必要があります。これにより、すべてのスレッドが枯渇し、大量のメモリが使用されます。非同期がサポートされている場合、すべてのリクエストはキューに入れられ、スレッドは他のリクエストを処理するために解放されます。リンクはこちら同じことを説明します。しかし、タイムアウトせずにイベントを受け取るまでリクエストを一時停止する手法は見当たりません。雰囲気のようなフレームワークはどのようにリクエストを一時停止しようとしますか? サーブレット 3.0 で http リクエストを中断できるのであれば、atmospehre のようなフレームワークは必要ないと思います。サーブレット 3.0 の非同期機能に従って常にスレッドがリクエストにアタッチされないため、Web ソケットの代わりにロング ポーリングでも問題ありません。