NIOとCometは完全に無関係です。それらを混在させることができます。
NIO(またはその点でAPR)コネクタを使用すると、スレッディングモデルにより、より少ないスレッドでより多くの要求を処理できます。コネクタの比較については、http://tomcat.apache.org/tomcat-7.0-doc/config/http.html#Connector_Comparisonを参照してください。
Comet(およびWebsocket)は、異なるアプリケーションアーキテクチャを必要とし、異なる方法でより高いスループットを達成する完全に異なるディスパッチモデルを備えています。
あなたの疑問にお答えするシナリオは、典型的なブロッキング1スレッド/リクエストモデルです。手順4では、Java BIOコネクタ(デフォルトのTomcat 7以降)は、キープアライブHTTP要求の場合、既存のコネクタに対する追加要求を引き続き待機します。クライアントが以前の要求でConnection:close
を設定せず、接続を閉じない場合、スレッドはキープアライブタイムアウトに達するまでハングします。 NIOコネクタを使用すると、スレッドは応答が送信された直後にスレッドプールに戻ります。決して到着しないかもしれないキープアライブ要求に対してスレッドを「無駄にする」ことはありません。
Comet/Websocketは、特別に書かれたサーブレット(およびオプションのフィルタ)にメッセージを配信することによって全く異なる働きをします。スレッドは、送信するメッセージまたは書き込むデータがある場合にのみ使用されます。
UPDATE 2016年8月19日
のTomcat 8.5と9.0は完全にBIOコネクタを落としています。これは、新しいAPIや技術(Websocketなど)の多くにノンブロッキングセマンティクスが必要であり、ブロッキングAPIの上にノンブロッキングサービスを構築することは非常に難しいためです。仕事を完成させるために必要なコードは、Tomcatコードの残りの部分を非常に醜いものにしていたため、BIOコネクタを完全に落とすという決定が下されました。したがって、Tomcat 8.5以降では、NIO、NIO2、およびAPRベースのコネクタのみが使用可能です。
Tomcat 8.5および9.0でも、コメットのサポートが無効になっていることに注意してください。 Cometの使用はすべて、より標準的なプロトコルであるWebsocketに置き換えてください。
?この種の動作は、Tomcat 7とTomcat 8のそれ以降のバージョンで変更されています。 –