I/O機能の拡張によるCometのサポート

Tomcat 6.0.xではAPRやJ2SE 1.4から導入されたNew I/Oを活用することでI/O機能が大幅に拡張された。特にデフォルトでCometをサポートしている点は、Webアプリケーション開発者にとって見逃せない。Cometとは、HTTPを使用して疑似的にプッシュ型の通信を実現する技術の総称である。

HTTPによる通信では、クライアントからサーバにリクエストが送られたら、サーバは即座にそれを処理してレスポンスを返すというのが普通だ。サーバは原則としてクライアントからのリクエストに応答するだけであり、通信を始めるタイミングはクライアント側が握っている。

しかしこの方法だと、サーバがクライアントに定期的にデータを送り続けたい場合や、多数のクライアントに一斉にデータを送りたい場合には問題がある。クライアント側ではサーバからいつデータが送られてくるかわからないため、リアルタイムにデータを受信するには短い間隔で定期的にリクエストを送る、いわゆるポーリングをしなければならないからだ。

Cometは、HTTPの原則を変えないまま、疑似的にプッシュ型の通信を実現することでこの問題を解決する。具体的には、サーバがクライアントからのリクエストを受け取った際に、すぐに処理せずにクライアントを待たせておく。そして自分がデータを送信したいタイミングでリクエストを処理し、レスポンスを返す。クライアント側は一度リクエストを発行したら、後はサーバから返事があるまで待つだけでよい。返事が返ってきたらそれを処理し、続けてデータを受け取りたければ即座にもう一度リクエストを発行して待つ。

さてTomcat 6.0.xでは、I/Oの拡張によってブロック無しでリクエストを処理できるようになり、Cometのような通信を行うことが可能になった。そしてCometの利用をサポートするいくつかのクラスが追加された。これらのクラスを利用することで、前述のようなプッシュ型の通信を利用したアプリケーションを容易に開発することができる。