56

まず第一に、私はここで炎上戦争を始めようとしているわけではありません。私はJerseyを十分に知っていますが、httpclientをほとんど使用したことがありません.

jersey-client と Apache の httpclient の主な違いは何ですか? ある分野が他の分野よりも優れているのはどの分野ですか? どこかに良い比較表はありませんか?より大きなファイル (たとえば 2048 MB) では、どちらがより優れたパフォーマンスを発揮しますか?

コメントありがとうございます!

4

1 に答える 1

91

この 2 つのことは、おそらく直接比較すべきではありません。Jersey は REST クライアントであり、完全な JAX-RS 実装、きちんとした流暢な API、強力なフィルター スタックを備えています。Apache Http Client は HTTP クライアントであり、タイムアウト、複雑なプロキシ ルート、接続ポーリングなどの低レベルの詳細を管理するのに最適です。それらは、プロトコル スタックのさまざまなレベルで動作します。Jersey を使用している場合、常に何らかの HTTP クライアント バックエンドが関与します。バックエンドが明示的に指定されていない場合、Jersey はHttpUrlConnectionデフォルトのバックエンドとして使用します。

Jersey と HttpUrlConnection バックエンドの例:

Client client = Client.create();
WebResource webResource = client.resource("http://localhost:8080/path");
ClientResponse response = webResource.accept("application/json")
                                     .get(ClientResponse.class);

Jersey と Apache Http Client バックエンドの例:

HttpClient apacheClient = HttpClientBuilder.create().build();
Client client = new Client(new ApacheHttpClient4Handler(apacheClient,
                                                        new BasicCookieStore(),
                                                        true));
WebResource webResource = client.resource("http://localhost:8080/path");
ClientResponse response = webResource.accept("application/json")
                                     .get(ClientResponse.class);

最後の例の Handler の使用法に注意してください。これは、Jersey がさまざまなバックエンドを組み込んで利用するための重要な統合抽象化です。最初の例はURLConnectionClientHandler、ボンネットの下で使用しています。

パフォーマンスと機能について言えば、Apache Http Client と Jersey を比較するのはほとんど意味がありません。Jersey自体はラッピングAPIにすぎないため、ここで異なるJerseyバックエンドを比較したい場合があります。私自身の経験に基づいて、HttpUrlConnection と Apache Http Client の主な違いをいくつか強調したいと思います。

HttpUrl接続

  • 外部依存関係は必要ありません。これは、組み込みプラットフォームまたはモバイル プラットフォームでは非常に価値があります。
  • どこでも非常によく文書化されています
  • API の設計が不十分です。HttpUrlConnectionに基づく実装は、保守と拡張が困難です。
  • 多くの機能は JVM プロパティを介して構成されますが、その一部は実行時に再構成できない場合があります。
  • 場合によっては、タイムアウトの処理に絶望的です。さまざまなタイムアウトに対して 10 個の異なる JVM プロパティを設定することになり、状況によっては接続が永久にハングすることがあります。
  • Gingerbread はAndroid の推奨http クライアント API であるためです。

アパッチ HTTP クライアント

  • 3.X バージョンの場合、そのパフォーマンスはHttpUrlConnection. バージョン 4.1 には多くのパフォーマンス強化が含まれており、対応するものよりもはるかに優れたパフォーマンスを発揮します
  • 接続とデータ読み取りのタイムアウトの管理が得意
  • その設計はOpen/Closed Principleに従っているため、HTTP 処理のほぼすべての部分を独自の実装でカスタマイズできます。例: リダイレクト戦略、再試行戦略、カスタム Cookie ストレージ、要求/応答のインターセプターなど。
  • 複雑なマルチ プロキシ パス用のカスタマイズ可能なルート ビルダーを使用して、豊富なプロキシ サポートを提供します。
  • すぐに使用できるルートごとの接続プールがあります。これにより、特にハードウェア PKCS#11 トークンが関係する場合に、SSL/TLS が使用されている場合にパフォーマンスが向上する可能性があります。HttpUrlConnection内部プーリングもありますが、何をいつプールするかをカスタマイズするツールはなく、プールの状態を確認するための監視機能もありません。
  • 詳細なロギング機能

com.sun.jersey.api.client.ClientHandler適切な実装がある場合は、Jersey で他のバックエンド (非ブロッキング クライアントなど) を使用することもできることに注意してください。

于 2013-10-22T18:22:22.720 に答える