Являются ли записи из кометного процессора Tomcat 6 неблокирующими

#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

Этот соединитель/протокол легко настраивается:

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