0

潜在的に多数のクライアントに対してマルチキャストを効果的に実行しているCometProcessor実装があります。すべてのクライアントに伝播する必要のあるイベントが発生すると、CometProcessorは応答を書き出すクライアントのリストをループする必要があります。応答の書き込みがブロックされると、低速のクライアントがイベントの配信に悪影響を与える可能性があります。例:

public class MyCometProcessor implements CometProcessor {
    private List<Event> connections = new ArrayList<Event>();
    public void onEvent(byte[] someInfo) {
        synchronized (connections) {
            for (Event e : connections) {
                HttpServletResponse r = e.getHttpResponse();

                // -- Does this line block while waiting for I/O --
                r.getOutputStream().write(someInfo);
            }
        }
    }

    public void event(CometEvent event) {
        switch (event.getEventType()) {
        case READ:
            synchronzied (connections) {
                connections.add(event);
            }
            break;
        // ...
        }

    }
}

更新:私自身の質問に答えます。CometProcessorからの書き込みがブロックされています:

http://tomcat.apache.org/tomcat-6.0-doc/config/http.html

ページ下部の表を参照してください。

4

1 に答える 1

1

Tomcat6 の HttpServlerResponse の実装は Response クラスです。内部的には、OutputBuffer をラップする CoyoteOutputStream を使用します。名前が示すように、このクラスはバッファで、デフォルト サイズは 8k です。したがって、少なくとも 8k 未満を書いている場合は、ブロックするつもりはありません。クライアントがデータを表示するには、フラッシュする必要がある場合があります。つまり、最終的には、使用しているコネクタ バリアントに依存します。非ブロッキング書き込みが必要な場合は、コネクタ構成で指定します

protocol=org.apache.coyote.http11.Http11NioProtocol

このコネクタ/プロトコルは、大規模な構成が可能です:

http://tomcat.apache.org/tomcat-6.0-doc/config/http.html

于 2008-09-21T13:19:45.413 に答える