Является ли запись изнутри Tomcat 6 CometProcessor неблокирующим - PullRequest
0 голосов
/ 21 сентября 2008

У меня есть реализация 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

См. Таблицу внизу страницы.

1 Ответ

1 голос
/ 21 сентября 2008

Реализация Tomcat6 HttpServlerResponse является классом Response. Внутренне он использует CoyoteOutputStream, обернутый вокруг OutputBuffer. Как следует из названия, этот класс является буфером, размер по умолчанию 8k. Поэтому я бы сказал, что, по крайней мере, если вы пишете менее 8 Кб, вы не собираетесь блокировать. Вам может потребоваться очистить данные, чтобы ваши клиенты увидели данные, что означает, что в конечном итоге это зависит от того, какой вариант соединителя вы используете. В вашей конфигурации Connector, если вы хотите неблокирующие записи, укажите

protocol=org.apache.coyote.http11.Http11NioProtocol

Этот Соединитель / Протокол настраивается массово:

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

...