Как кэшировать объект httpclient в Java? - PullRequest
0 голосов
/ 30 января 2019

Использование Apache HttpClient 4.5.x в моем клиентском веб-приложении, которое подключается (и входит в систему) к другому (скажем, главному) веб-приложению сервера.

Отношения между этими 2 веб-приложениями очень разные.для многих - то есть для какого-то запроса пользователя в клиентском веб-приложении, он должен войти в систему как другой пользователь + сделать остальной вызов в веб-приложении сервера.Таким образом, необходимо некоторое разделение хранилищ cookie, и нет способа (есть?) получить / установить хранилище cookie после создания экземпляра httpclient, поэтому каждый поток запросов, полученный в клиентском веб-приложении, выполняет что-то подобное (и требуетдля оптимизации):

HttpClient client = HttpClientBuilder.create().setDefaultCookieStore(new BasicCookieStore()).build();
//Now POST to login end point and get back JSESSIONID cookie and then make one REST call, and then the client object goes out of scope when the request ends.

Я надеялся спросить о наилучшей практике кэширования объекта экземпляра httpclient, поскольку он тяжелый, и предполагается, что его можно использовать повторно как минимум для нескольких запросов, если не для всего клиентского веб-приложения.как статический синглтон.

В частности, я надеялся на совет, какой из этих (если таковые имеются) подходов будет представлять собой наилучшую практику:

  1. Используйтеstatic ConcurrentHashMap для кэширования httpclient и связанного с ним basiccookiestore для каждого «пользователя» в клиентском веб-приложении и входа в систему только в том случае, если срок действия кэшированного cookie-файла близок к концу.Не уверен насчет использования памяти, и неиспользуемый / редко используемый httpclient остается в памяти без выселения.

  2. Кэшируйте только Cookie (каким-то образом), но воссоздайте новый httpclientвозражать всякий раз, когда возникает необходимость использовать этот файл cookie для вызова покоя.Это сохраняет предыдущий вызов для входа в систему до истечения срока действия cookie, но повторное использование htptclient не требуется.

  3. PooledConnectionManager - но не может легко найти примеры, хотя может потребовать разработкистратегия выселения, максимальное количество потоков и т. д. (может быть сложным).

Есть ли лучший способ сделать это?Спасибо.

Ссылки:

Обычно рекомендуется иметь один экземпляр HttpClient для каждого компонента связи или дажеза приложение

Ответы [ 2 ]

0 голосов
/ 30 января 2019

Зачем вам все это делать?Можно назначить разные CookieStore для каждого запроса, используя локальный HttpContext.

При необходимости можно сохранить карту CookieStore экземпляров для каждого уникального пользователя.

CloseableHttpClient httpclient = HttpClients.createDefault();
CookieStore cookieStore = new BasicCookieStore();

// Create local HTTP context
HttpClientContext localContext = HttpClientContext.create();
// Bind custom cookie store to the local context
localContext.setCookieStore(cookieStore);

HttpGet httpget = new HttpGet("http://httpbin.org/cookies");
System.out.println("Executing request " + httpget.getRequestLine());

// Pass local context as a parameter
CloseableHttpResponse response = httpclient.execute(httpget, localContext);
try {
    System.out.println("----------------------------------------");
    System.out.println(response.getStatusLine());
    List<Cookie> cookies = cookieStore.getCookies();
    for (int i = 0; i < cookies.size(); i++) {
        System.out.println("Local cookie: " + cookies.get(i));
    }
    EntityUtils.consume(response.getEntity());
} finally {
    response.close();
}
0 голосов
/ 30 января 2019

Использование одновременной хэш-карты было бы самым простым способом для достижения того, что вы хотите сделать.

Кроме того, если вы используете Spring, вы можете создать компонент для хранения HTTP-клиента.

...