0

Jetty v9.0.2 を使用して非同期リクエストを送信する Jetty HttpClient があります。応答を正常にバッファリングする Response.ContentListener と、呼び出しが完了したときに呼び出される Response.CompeleteListener があります。

  • Jetty 9.2 JavaDocs にはRequest.AsyncContentListenerがあり、Jetty にコンテンツが消費されたことを伝えるパラメーターがあります。
    • callback - コンテンツが消費されたときに呼び出すコールバック。

このリスナー タイプは、Jetty v9.0.2 Response API にはありません。

  • org.eclipse.jetty.client.api をインポートします。結果;

実際には2つの質問があります:

  1. Response.ContentListener は、コンテンツが消費されたことを Jetty クライアントに通知する必要がありますか?
    • もしそうなら:Jetty v9.0.2でどのように管理されていますか
  2. これら 2 つの Response.ContentListener と Response.CompeleteListener のセットアップで非同期呼び出しを使用すると、どのようなクリーンアップが必要になりますか?
    • Jetty v9.0.2 で async を使用する潜在的な落とし穴はありますか?

正常に動作しているようです。リソース リークやリークの可能性などがないことを確認する必要があります。もちろん、24 時間年中無休で実行できるように、プログラムが適切でクリーンである必要があります。 よろしくお願いいたします。

ノート:

4

1 に答える 1

0

この質問に対する簡単な答えは、非同期呼び出しの処理が完了した後にHttpClient.stop () を呼び出すことです。このチュートリアルの例では、ソリューション アプローチの概要が説明されています。

主な側面は、(すべての) リスナーが終了し、処理が完了するまで、stop () を呼び出すことはできないということです。上記の例では、CountdownLatchを使用して stop() 呼び出しを同期しています。これは、Jetty の例では実際には説明されていません。

一部の非同期インターフェイスは、「コンテンツの消費」などの呼び出しを使用します。ただし、Jetty 9 では、stop() 呼び出しがクリーンアップを行います。

私たちのユースケースは単純明快でした。リスナーの onComplete() メソッドで、Httpclient.send()のカウント ダウン ラッチをデクリメントするsetCompleted () メソッドが呼び出されます。send() 呼び出しに続いて、setCompleted() の呼び出しを待機するfinished () という同期メソッドがあります。

public  boolean finish(){

    boolean result      = false;
    int     retryCount  =  0;

    try
    {
        if( !this.latch.await( 5, TimeUnit.SECONDS ) )
        {
            Util.warn(LOG,"Timed-out -- msg #", String.format("%0,4d", this.msgId) );
        }

        this.httpClient.stop();
        result = this.httpClient.isStopped();
    }
    catch (InterruptedException ex )
    {
        log.warn("Interrupted -- msg #", String.format("%0,4d", this.msgId)" );
    }
    catch (Exception ex)
    {
        log.error(LOG,"Stop-exception -- msg #", String.format("%0,4d", this.msgId) );
    }

    if( !result )
    {
        log.warn(" * HttpClient NOT stopped -- msg #", String.format("%0,4d", this.msgId) );
    }

    return  result;
}

setCompleted() が onComplete() メソッドの最後で呼び出される限り、停止呼び出しは呼び出しに満足しているようです。onComplete の内部タイミングを確認できないかどうかはわかりません。そうでなければ、それはすべて満足のいくようです。API ドキュメントには、この種の操作 (データ通信、データベースなど) の「クリーンアップ コード」を含める必要があると本当に信じています。この投稿が他のユーザーの時間を節約できることを願っています。

于 2014-10-28T23:50:57.163 に答える