Внимание: 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