1
    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 ミリ秒に短縮されます。

4

1 に答える 1