2012-04-27 3 views
1

Я использую комету с tomcat 6 для передачи данных клиентам.Отключить буферизацию вывода в tomcat 6 для сервлетов комет

Я хочу получать данные до того, как соединение закроется (состояние готовности = 3 для XMLHttpRequest), и проблема в том, что tomcat 6 буферизует данные перед отправкой, так что мне нужно сделать сложные вещи, чтобы добиться этого.

Я установил тип содержимого запроса для приложения/x-javascript и типа содержимого req для приложения/xml (чтобы отключить кеш браузера).

Я использовал множество доступных опций в tomcat 6 для отключения кеша (socketBuffer = -1 в nio-коннекторе и т. Д.), И это работает в моем локальном tomcat 6 (на окнах os) (фактически, даже без изменение любого параметра по умолчанию).

Но, событие с той же конфигурацией tomcat 6, когда я развертываю приложение на сервере tomcat 6, предоставляемом http://jelastic.com, буфер вывода сервера большой, и я обязан отправлять пустые байты, чтобы запускать сброс записи записи (cf .следующий код)

byte [] bytes = new byte [event.getHttpServletResponse(). getBufferSize() - новый Gson(). toJson (messagesContent) .getBytes(). length]; event.getHttpServletResponse(). GetOutputStream(). Write (новый Gson(). ToJson (messagesContent) .getBytes()); event.getHttpServletResponse(). GetOutputStream(). Write (bytes); event.getHttpServletResponse(). GetOutputStream(). Flush();

Если я не буду писать байты в дополнение к моему содержанию данных, данные не будут отправляться клиенту. Это действительно раздражает, потому что я посылаю бесполезные пустые байты и потому, что мне нужно управлять этими пустыми байтами на клиенте. Какой ужас.

У кого-нибудь есть решение? Как отключить выходной буфер серета кометы. Мне кажется настолько очевидным, что выходной буфер должен быть отключен для сервлетов комет по умолчанию. Звучит странно.

Благодаря авансовым,

J

ответ

3

Вы пробовали с помощью фильтров? http://www.oracle.com/technetwork/java/filters-137243.html в Программирование Индивидуальные запросы и ответы

Используя шаблон декоратора, вы можете управлять выходом. Способ сделать это - передать сервлет, который генерирует ответ на поток в режиме ожидания. Резервный поток предотвращает закрытие исходного потока ответа сервлетом при его завершении.

class CharResponseWrapper extends HttpServletResponseWrapper { 
    private CharArrayWriter output; 
    public String toString() { 
     return output.toString(); 
    } 
    public ResponseWrapper(HttpServletResponse response) { 
     super(response); 
     output = new CharArrayWriter(); 
    } 
    public PrintWriter getWriter(){ 
     return new PrintWriter(output); 
    } 

} 

Таким образом, в методе doFilter фильтра вы получите оригинальный PrintWritter, передать обертку

PrintWriter out = response.getWriter(); 
CharResponseWrapper wrapper = new CharResponseWrapper((HttpServletResponse)response); 
chain.doFilter(request, wrapper); 

И тогда сервлет будут writte всех выходных в CharrArrayWritter, так что вы можете получить выход в строка без буферизации

wrapper.toString() 

, то вы можете изменить, добавить .. и т.д., а затем использовать оригинальный выход ответ на writte содержание.

out.write(wrapper.toString()); 
out.close(); 
Смежные вопросы