Клиентское соединение с Джерси закрыло проблему утечки памяти - PullRequest
4 голосов
/ 04 ноября 2011

Я использую 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();
        }

    }

ТИА, Виджей

1 Ответ

8 голосов
/ 21 июня 2012

Насколько я знаю, да, это правильный способ закрыть клиент Джерси ... со следующими оговорками.

1) Что вы пытаетесь предотвратитьне утечки памяти, а утечки соединения (к серверу, к которому вы обращаетесь) ...

2) О классе Client написано в главе 3Справочник Джерси :

Клиентские экземпляры - это дорогостоящие ресурсы.Рекомендуется использовать настроенный экземпляр для создания веб-ресурсов.Создание веб-ресурсов, создание запросов и получение ответов гарантированно безопасны для потоков.Таким образом, экземпляр Client и экземпляры WebResource могут совместно использоваться несколькими потоками

Поэтому, если вы планируете выполнять несколько вызовов, будет хорошей идеей , а не , вызывать уничтожение для каждоговызов.То же самое (но в меньшей степени) верно для WebResources.

3) То, что я описываю, относится к Джерси 1.1 (но я вижу темы по этому поводу еще в 2009 ).

...