Java 来自Tomcat 6处理器内的写入是否为非阻塞

Java 来自Tomcat 6处理器内的写入是否为非阻塞,java,tomcat,servlets,comet,Java,Tomcat,Servlets,Comet,我有一个CometProcessor实现,它可以有效地对潜在的大量客户机进行多播。当发生需要传播到所有客户机的事件时,CometProcessor将需要在客户机列表中循环,写出响应。如果写响应受阻,则潜在的慢客户可能会对事件的分布产生不利影响。例如: public class MyCometProcessor implements CometProcessor { private List<Event> connections = new ArrayList<Event

我有一个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;
        // ...
        }

    }
}
公共类MyMetProcessor实现CometProcessor{
私有列表连接=新建ArrayList();
public void onEvent(字节[]someInfo){
已同步(连接){
对于(事件e:连接){
HttpServletResponse r=e.getHttpResponse();
//--此行在等待I/O时是否阻塞--
r、 getOutputStream().write(someInfo);
}
}
}
公共无效事件(CometEvent){
开关(event.getEventType()){
案情如下:
同步(连接){
添加(事件);
}
打破
// ...
}
}
}
更新:回答我自己的问题。来自CometProcessor的写入正在阻塞:


请参阅页面底部的表格。

Tomcat6的HttpServlerResponse实现是响应类。在内部,它使用环绕OutputBuffer的CoyoteOutputStream。顾名思义,这个类是一个缓冲区,默认大小为8k。所以我想说,至少如果你写的东西少于8k,那么你就不会阻塞。您可能需要刷新,以便客户端查看数据,这意味着最终它取决于您使用的连接器变体。在连接器配置中,如果需要非阻塞写入,请指定

protocol=org.apache.coyote.http11.Http11NioProtocol

此连接器/协议可大规模配置: