У меня есть реализация 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
См. Таблицу внизу страницы.




Реализация HttpServlerResponse в Tomcat6 - это класс Response. Внутри он использует CoyoteOutputStream, обернутый вокруг OutputBuffer. Как следует из названия, этот класс представляет собой буфер размером по умолчанию 8 КБ. Так что я бы сказал, что, по крайней мере, если вы пишете меньше 8 КБ, вы не собираетесь блокировать. Однако вам может потребоваться очистка, чтобы ваши клиенты увидели данные, что означает, что в конечном итоге это зависит от того, какой вариант соединителя вы используете. В конфигурации вашего коннектора, если вы хотите неблокирующую запись, укажите
protocol=org.apache.coyote.http11.Http11NioProtocol
Этот коннектор / протокол можно настраивать массово: