Записывает изнутри Tomcat 6 CometProcessor, неблокирующий

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

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

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
2 170
1

Ответы 1

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

protocol=org.apache.coyote.http11.Http11NioProtocol

Этот коннектор / протокол можно настраивать массово:

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

Другие вопросы по теме