4

私はJersey v10を使用しており、次のコードを書きました。これは、Jerseyクライアント接続を閉じてメモリリークを回避する正しい方法ですか.私は最終的にこれまで呼び出しを行っていませんでした.

ClientConfig config = setupHttps();
    final Client c = Client.create(config);

    final WebResource r = c.resource(baseUri);
    ClientResponse response = null;
    try {
        response = r.path("/....")
                .header("contentId", id)
                .header("sid", sid).get(ClientResponse.class);
        ...



    } catch (Exception e) {
        log.error("Error returning contentServiceName.");

    } finally {
        if (response != null) {
            response.close();
        }
        if (c!= null) {
            c.destroy();
        }

    }

TIA、ビジェイ

4

1 に答える 1

8

私の知る限り、はい、これが Jersey クライアントを閉じる正しい方法です...次の注意事項があります。

1)防止しようとしているのは、メモリリークではなく、(アドレス指定しているサーバーへの)接続リークです...

2) 以下は、Jersey Handbook の第 3 章のClientクラスについて書かれています。

クライアント インスタンスは高価なリソースです。Web リソースの作成には、構成済みのインスタンスを再利用することをお勧めします。Web リソースの作成、リクエストの構築、およびレスポンスの受信は、スレッド セーフであることが保証されています。したがって、Client インスタンスと WebResource インスタンスは複数のスレッド間で共有される場合があります

したがって、複数の呼び出しを行う予定がある場合は、すべての呼び出しに対して destroy を呼び出さないことをお勧めします。WebResources についても同じことが (程度は低いですが) 当てはまります。

3) 私が説明しているのは、Jersey 1.1 のものです (ただし、これに関するスレッドは 2009 年までさかのぼります)。

于 2012-06-21T11:43:08.023 に答える