2008-09-20 6 views
0

У меня есть реализация CometProcessor, которая эффективно выполняет многоадресную передачу для потенциально большого числа клиентов. Когда происходит событие, которое необходимо распространить на всех клиентов, CometProcessor необходимо будет перебрать список клиентов, выписывающих ответ. Если записывать блок ответов, существует вероятность того, что потенциально медленные клиенты могут негативно повлиять на распределение события. Пример:Является ли запись из Tomcat 6 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; 
     // ... 
     } 

    } 
} 

Update: Отвечая на мой собственный вопрос. Пишет из CometProcessor блокируют:

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

Смотрите таблицу в нижней части страницы.

ответ

1

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

protocol=org.apache.coyote.http11.Http11NioProtocol

Этот разъем/Протокол массивно настраивается:

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