私は、JavaサーブレットにHTTPリクエスト(テスト目的でGET)をとる設定を行っています。どのように動作するのですか、serはletがブラウザからリクエストを受け取り、それを解析し、TCPソケットを介して 'メイン'サーバーに送信します。このサーバーは要求を処理し、応答を返します。サーブレットは、以前にConcurrentHashMapに格納されていたHttpServletResponseを取得し、PrintWriterを開き、応答を返します。 HttpServletResponseがPrintWriterに書き込まれた情報を返すとは限りませんが、すべてがスムーズに進んでいます。ブラウザは毎回「OK」の応答を受信しますが、レスポンスには書き込みしようとする情報は含まれていないことがよくあります。HttpServletResponseが定期的に途中で送信されているようです
以下は、HttpServletResponseインスタンスを手渡した最初のdoGetのコードと、レスポンスバッファに書き込むメソッドです。それ以降はブラウザが受け取ったレスポンスが含まれます。その後、問題を確実に解決するために、期待される結果を確実に得る方法についてのいくつかの観察。
唯一の変数は、応答が書き込まれるかどうかであるように見えることに注意してください。私は、出力ログを注いだし、応答が期待どおりに書き込まれた時間とそうでない時間との間に他の違いは見つかりません。私が書いたHTTPServletResponseListenerは毎回レスポンスを受け取ります。
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String js = request.getParameter("json");
// Omitting try-catch for space
Message msg = this.parser.parseToMessage(js);
this.sc.send(msg, new HTTPServletResponseListener(response));
}
および応答で呼び出されHTTPServletResponseListener法[Glassfishの3.1.1を使用して]
(のみローカルフィールドにローカルHttpServletResponseのを割り当てるコンストラクタ以外に、これが唯一の方法である)
public void handleResponse(ResponseMessage response) {
DataParser parser = new JSONParser();
String temp = parser.parseToString(response);
httpResponse.setContentType("application/json");
httpResponse.addHeader("Hmm","yup");
try {
PrintWriter out = httpResponse.getWriter();
out.println(temp);
} catch (IOException ex) {
Logger.getLogger(HTTPServletReponseListener.class.getName()).log(Level.SEVERE,null,ex);
}
}
応答とブラウザがそれを受信します。
意図したとおりにそれが動作するとき:
応答が空である:意図したとおりの応答がある場合は
HTTP/1.1 200 OK
X-Powered-By: Servlet/3.0 JSP/2.2 (GlassFish Server Open Source Edition 3.1.1 Java/Sun Microsystems Inc./1.6)
Server: GlassFish Server Open Source Edition 3.1.1
Content-Length: 0
Date: Thu, 16 Feb 2012 15:26:35 GMT
:
HTTP/1.1 200 OK
Hmm: yup
X-Powered-By: Servlet/3.0 JSP/2.2 (GlassFish Server Open Source Edition 3.1.1 Java/Sun Microsystems Inc./1.6)
Server: GlassFish Server Open Source Edition 3.1.1
Content-Type: application/json;charset=ISO-8859-1
Content-Length: 126
Date: Thu, 16 Feb 2012 15:27:30 GMT
観察:
私は、以下の手順を実行して、応答の時間の95%を取得することができます....そうでなければ、約50%の成功率。
ブラウザ上でヒットリフレッシュ...(別のテスト要求を送信する)、再びリフレッシュを打つ前に、より頻繁に 待ち少なくとも5秒で作業する傾向が展開後の最初のカップルを要求 が、これは確実に動作する傾向があります。失敗した場合、15秒待たなければならなくなり、その後再び動作する傾向があります。
応答を待つ前にHttpServletResponseが書き込まれている場合は、毎回動作します。
この度は読んでいただきありがとうございます。私は他のStackoverflowの質問を読んだことがありますが、私は接続がない限り、この特定の問題に触れるものはありません。
'sc.send()'コールは非ブロック化ですか?そうであれば、サーブレットコンテナがリクエスト/レスポンスオブジェクト(ほとんどの場合)をプールすると問題に陥る可能性があります。 –
それは確かにノンブロッキングです、私はあなたと以下の@tomaszが死んでいると思います、私はこれで仕事に戻ることができるようになるとすぐに更新します:) –