HttpParams params = new BasicHttpParams();
params.setParameter(CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1);
HttpClient httpclient = new DefaultHttpClient(params);
HttpPost httppost = new HttpPost(address);
try {
// Execute HTTP Post Request
HttpResponse response = httpclient.execute(httppost);
} catch (IOException ex) {
logger.log(Level.SEVERE, null, ex);
}
このコード スニペットを使用して、localhost にある Apache Tomcat のサーブレットに HTTP POST 要求を送信しています。Tomcat アドレスへのポスト リクエスト (パラメータなし) には、http://127.0.0.1:8084
約 1000 ミリ秒かかります。アドレスでApache(ワンプサーバー)に送信されたときの同じリクエストは20ミリ秒http://127.0.0.1
しかかかりません。
両方の Http バージョン (1.0/1.1) で既に試しましたが、応答時間に影響はありません。
何がうまくいかなかったのか手がかりはありますか?または、このパフォーマンスを向上させる方法は? それとも、Tomcat 自体が非常に遅く、この問題に関して何もできないのでしょうか? (ただし、ブラウザは、ネットワークの大幅な遅延なしにサーブレットをロードできます!)
追加情報:
このコード自体は、基本的に何もせず、このリクエストを行うだけのサーブレット内にあります。リクエストを処理するはずのサーブレットも「空白」です。また、シナリオ全体に関与する JSP はありません。また、タイミングの記録はコールド Tomcat のものではありません。1 回目と (場合によっては) 2 回目の呼び出しには 2000 ミリ秒以上かかります。ただし、連続したリクエストは 1000 ミリ秒以上に正規化されます。SO、それは確かに冷たいトムキャットの問題ではありません。
さて、ここの人々が私にサーブレットのコードも尋ねてきたので。これが私が取り組んでいる基本的な設計です。
サーブレット A は、私が作成した AgniLogger クラスを使用して何らかの作業を行い、それをログに記録することになっています。そのクラスはライブラリにあり、複数のコンポーネントから使用される予定です。次に、サーブレット B に POST 要求を送信するために上記のコードを使用しています。サーブレット B は実際のログを行います。現在、このサーブレット B はまだ実装されていません。サーブレット A と B は、異なる Web アプリケーションの一部です。
サーブレット A: http://pastebin.com/tQjtvG3g
AgniLogger: http://pastebin.com/nGJypmCN
サーブレット B: http://pastebin.com/psCxLCYY
PS: 私は開発に Netbeans を使用していますが、これまでのところプロジェクトに web.xml はありません。
回避策(非常に奇妙ですが!)
サーブレット B の processRequest() 関数の定義を {blank} から次のように変更すると:
PrintWriter out = response.getWriter();
try {
//do nothing
} finally {
out.close();
}
問題は解決します。ポート 80 の Apache (WAMP) サーバーと同じように、応答時間は約 20 ミリ秒に短縮されます。