Интеграция постоянного кэширования в Apache Httpclient с EhCache

Сегодня я хотел интегрировать постоянный кеш в библиотеку apache httpclient. Быстрый просмотр документации по Http-Caching говорит ты:

Текущий выпуск включает поддержку хранения записей кэша с использованием реализаций EhCache и memcached, которые позволяют переносить записи кэша на диск или сохранять их во внешнем процессе.

Справедливости ради, быстрый поиск в гугле позже я понятия не имел, что делать и как это делать;)

Но был еще один намек:

Если ни один из этих вариантов не подходит для вашего приложения, можно предоставить собственный бэкэнд хранилища, реализовав интерфейс HttpCacheStorage и затем предоставив его для кэширования HttpClient во время создания.

Итак, по крайней мере, мы знаем, что HttpCacheStorage необходимо инициализировать с помощью некоторого класса, реализующего HttpCacheStorage.

Вопрос в одном строчке:

  • Как интегрировать кеширование в любой http-запрос?
  • Как инициализировать EhCache?
  • Как интегрировать EhCache в http-кеширование?

person Sebastian van Wickern    schedule 23.04.2014    source источник


Ответы (1)


Внимание: LOCALRESTARTABLE стратегия Ehcache требует лицензии Enterprise. Что ж, это сработало бы отлично, если бы у меня была коммерческая лицензия EhCache, которой у меня нет. Если бы я знал это, я бы не столкнулся с трудностями.

Если копать дальше с помощью Google и документации Httpclient, первое, что вам нужно сделать, это добавить httpclient-cache-<version>.jar в путь к классам.

После этого используйте org.apache.http.impl.client.cache.CachingHttpClients вместо org.apache.http.impl.client.HttpClients

Теперь вы можете собрать конфигурацию из документации.

 CloseableHttpClient httpclient = CachingHttpClients.custom()
   .setCacheConfig(cacheConfig)
   .setHttpCacheStorage(ehcacheHttpCacheStorage)
   .build();

Это оставляет вам попытки выяснить, как настроить cacheconfig, что довольно просто.

//build the cacheconfig. this part belongs to httpclient
CacheConfig cacheConfig = CacheConfig
     .custom()
     .setMaxCacheEntries(1000)
     .setMaxObjectSize(8192)
     .build();

Следующее, о чем следует беспокоиться, - это EhCacheHttpCacheStorage, это довольно проблематично, поскольку конструктор EhcacheHttpCacheStorage принимает EhCache, но нет прямого способа его инициализировать. Что вам нужно сделать, так это построить CacheManager, добавить к нему кеш, вытащить его из CacheManager и, наконец, обернуть его в EhcacheHttpCacheStorage

Шаг 1: Создайте менеджера:

mgr = CacheManager.create();

Шаг 2: Создайте кеш:

Cache testCache = new Cache(new CacheConfiguration("http", 100000)
.memoryStoreEvictionPolicy(MemoryStoreEvictionPolicy.LFU)
.eternal(false)
.timeToLiveSeconds(60)
.timeToIdleSeconds(30)
.diskExpiryThreadIntervalSeconds(0)
//Persist everything and keep it on restart
.persistence(new PersistenceConfiguration().strategy(Strategy.LOCALRESTARTABLE)));

Шаг 3: добавляем в менеджер:

mgr.addCache(testCache);

Шаг 4: достаем кеш из менеджера:

Cache cache = mgr.getCache("http");

Шаг 5: оберните его в EhcacheHttpCacheStorage, который реализует HttpCacheStorage

EhcacheHttpCacheStorage ehcacheHttpCacheStorage = new EhcacheHttpCacheStorage(cache);

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

import net.sf.ehcache.Cache;
import net.sf.ehcache.CacheManager;
import net.sf.ehcache.config.CacheConfiguration;
import net.sf.ehcache.config.Configuration;
import net.sf.ehcache.config.DiskStoreConfiguration;
import net.sf.ehcache.config.PersistenceConfiguration;
import net.sf.ehcache.config.PersistenceConfiguration.Strategy;
import net.sf.ehcache.store.MemoryStoreEvictionPolicy;

import org.apache.http.impl.client.cache.CacheConfig;
import org.apache.http.impl.client.cache.CachingHttpClients;
import org.apache.http.impl.client.cache.ehcache.EhcacheHttpCacheStorage;


//build the cacheconfig. this part belongs to httpclient
CacheConfig cacheConfig = CacheConfig
     .custom()
     .setMaxCacheEntries(1000)
     .setMaxObjectSize(8192)
     .build();
//this part creates the ehcache 
//Create a singleton CacheManager using defaults
mgr = CacheManager.create();

//Create a Cache named http specifying its configuration.
Cache testCache = new Cache(new CacheConfiguration("http", 100000)
.memoryStoreEvictionPolicy(MemoryStoreEvictionPolicy.LFU)
.eternal(false)
.timeToLiveSeconds(60)
.timeToIdleSeconds(30)
.diskExpiryThreadIntervalSeconds(0)
//Persist everything and keep it on restart
.persistence(new PersistenceConfiguration().strategy(Strategy.LOCALRESTARTABLE)));
mgr.addCache(testCache);
//get the cache back out the manager
Cache cache = mgr.getCache("http");

// and we are back to http-client
//Wrap it around EhcacheHttpCacheStorage which implements HttpCacheStorage
EhcacheHttpCacheStorage ehcacheHttpCacheStorage = new EhcacheHttpCacheStorage(cache);
//And Configure the httpclient
CloseableHttpClient httpclient = CachingHttpClients.custom()
   .setCacheConfig(cacheConfig)
   .setHttpCacheStorage(ehcacheHttpCacheStorage)
   .build();
person Sebastian van Wickern    schedule 23.04.2014
comment
Кстати, что не так с упомянутой вами лицензией EhCache? - person Hendy Irawan; 01.07.2015
comment
Хорошо, думаю, я понимаю, что вы имеете в виду: стратегия: Настраивает тип сохранения, обеспечиваемый настроенным кешем. Это должно быть одно из следующих значений: * localRestartable - включает RestartStore и копирует все записи кэша (в куче и / или вне куча) на диск. Эта опция обеспечивает быстрый перезапуск с сохранением отказоустойчивого кэша на диске. Он доступен только для пользователей Enterprise Ehcache. - person Hendy Irawan; 01.07.2015
comment
Кажется, есть альтернатива: ManagedHttpCacheStorage + FileResource. то есть в ближайшее время: CachingHttpClients.createFileBound(new File("cache/httpclient")) - person Hendy Irawan; 01.07.2015
comment
Извините, я опубликовал это некоторое время назад и какое-то время не работал с этой технологией. Но, похоже, у вас все хорошо и без моей помощи :) - person Sebastian van Wickern; 01.07.2015