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 回答