#java #tomcat #servlets #comet
Вопрос:
У меня есть реализация 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;
// ...
}
}
}
Обновление: Отвечаю на свой собственный вопрос. Записи с кометного процессора блокируются:
http://tomcat.apache.org/tomcat-6.0-doc/config/http.html
Смотрите таблицу в нижней части страницы.
Ответ №1:
Реализация httpserverresponse в Tomcat6-это класс ответа. Внутренне он использует поток coyoteoutput, обернутый вокруг буфера вывода. Как следует из названия, этот класс является буфером, размер по умолчанию 8 кб. Поэтому я бы сказал, по крайней мере, если вы пишете меньше 8 тысяч, то вы не собираетесь блокировать. Возможно, вам потребуется выполнить очистку, чтобы ваши клиенты могли видеть данные, что означает, что в конечном итоге это зависит от того, какой вариант соединителя вы используете. В конфигурации соединителя, если вы хотите неблокирующую запись, укажите
protocol=org.apache.coyote.http11.Http11NioProtocol
Этот соединитель/протокол легко настраивается: