2012-01-24 15 views
4

は、私は次のように桟橋HTTPクライアントが構成されている:非同期呼び出しのために長いへの道を思わなぜJetty Http Clientが遅いのですか?

HttpClient client = new HttpClient(); 
    client.setTimeout(connectionTimeout); 
    client.setIdleTimeout(readTimeout); 
    client.setMaxConnectionsPerAddress(100); 
    client.setThreadPool(new QueuedThreadPool(100)); 
    client.setConnectorType(HttpClient.CONNECTOR_SELECT_CHANNEL); 
    client.setMaxRetries(retries); 

、常に以下の呼び出しがかかる〜400msのを。明確にするために、私はリクエストの応答時間を心配していません。ちょうどメソッド呼び出しは私のスレッドを400msの間ビジーに保ちます。このメソッドはどこかでブロックされているようですが、非同期でなければなりません。

client.send(httpExchange); 

どのように構成が乱れていますか?

+0

あなたはサーバの多様でこれを試したことがありますか? – cheeken

+0

いいえ、これは非同期のコールコールである必要がありますので、サーバは問題ではありません。 –

+0

'send()'コールの継続時間はどのように測定していますか? – aroth

答えて

4

私はこれをテストする時間がなかったが、私はあなたの修正がデフォルト、接続上のHttpClientブロックであること、と思われる

client.setConnectBlocking(false); 

である疑いがある - コネクタは非ブロックされた場合でも、要求+応答の送受信。

(それは私が桟橋8のためにチェックしていません突堤7を前提とし)

+0

それは働く、私は桟橋を持っていた7 –

+0

ありがとう! Jetty 8で見ていた問題を修正しました。 – jlunavtgrad

-1

send()への呼び出しは、それは時間がかかるかもしれない理由を私は知らないが、それはあなたのためにあまりにも遅いです場合、それは別のスレッドにsend()コールオフロードすることは簡単なことです:あなたは次に

public class SendThread extends Thread { 
    private HttpClient client; 
    private HttpExchange exchange; 

    public SendThread(HttpClient client, HttpExchange exchange) { 
     this.client = client; 
     this.exchange = exchange; 
    } 

    @Override 
    public void run() { 
     client.send(exchange); 
    } 
} 

を行うことができます。

new SendThread(client, exchange).start(); 

...の代わりに:

client.send(httpExchange); 

なぜ、図書館がそんなに長い時間を要しているのかを解明したいのであれば、source codeを見てみることもできます。一見すると、私は1)何がsend()であるかはまったく自明ではなく、2)非同期であると思われる唯一のものは、実際のデータ/ペイロードをサーバに送ることです。サーバーへの初期接続の作成などの作業は、send()の呼び出しの一部として同期して実行されているようです。

関連する問題