2012-04-27 26 views
1

Tomcat 6で彗星を使用してクライアントにデータをプッシュします。cometサーブレット用のtomcat 6の出力バッファリングを無効にする

接続を閉じる前にデータを受信したい(XMLHttpRequestの準備状態= 3)。問題は、Tomcat 6がデータを送信する前にバッファリングしているため、これを達成するために厄介なことをする必要があるということです。

リクエストのコンテンツタイプをapplication/x-javascriptに、reqのコンテンツタイプをapplication/xml(ブラウザのキャッシュを無効にするため)に設定しました。

私は、キャッシュを無効にするためにtomcat 6の多くの利用可能なオプションを使用しています(ソケットコネクタなどでsocketBuffer = -1)。これはローカルのtomcat 6(windows os)で動作しますデフォルトのオプションを変更する)。

しかし、同じ設定のtomcat 6の場合、http://jelastic.comで提供されているtomcat 6サーバーにアプリケーションをデプロイすると、サーバーの出力バッファーが大きくなり、出力ライターのフラッシングをトリガーするために空のバイトを送信する義務があります。次のコード)

バイト[] bytes =新しいバイト[event.getHttpServletResponse().getBufferSize() - 新しいGson()。toJson(messagesContent).getBytes()。length]; event.getHttpServletResponse()。getOutputStream()。(新しいGson()。toJson(messagesContent).getBytes()); event.getHttpServletResponse()。getOutputStream()。write(bytes); event.getHttpServletResponse()。getOutputStream()。flush();

データコンテンツに加えてバイトを書き込まないと、データはクライアントに送信されません。これは本当に面倒です、私は無駄な空のバイトを送信するため、私はクライアント上でこれらの空のバイトを管理する必要があるためです。恐ろしい。

解決方法はありますか? cometサーブレット出力バッファを無効にする方法。出力バッファは、デフォルトでcometサーブレットに対して無効にする必要があります。奇妙に聞こえる。事前による

おかげで、

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); 

ラッパーを渡し、あなたが出力を得ることができるので、その後、サーブレットはCharrArrayWritterにすべての出力をで書かれますその後、あなたはなど。追加、変更、および、コンテンツをで書かために、元の応答出力を使用することができます

wrapper.toString() 

をバッファリングせずに文字列。

out.write(wrapper.toString()); 
out.close(); 
関連する問題