How do I implement client side http caching like a

2019-04-10 06:14发布

I use a RESTFul service as a backend to my frontend. The service sets expires/etag/lastmodified headers on it's responses.

What I'm looking for is a client-side(favorably java) library which can fetch data from the service and cache it in a pluggable caching backend like ehcache.

What I also want to be able to do is automatically prime the cache using background worker threads as soon as an entry is invalidated. Also, it should be smart to do conditional GETs.

I've come across http://hc.apache.org/httpcomponents-client-ga/tutorial/html/caching.html

Is there any other library anyone knows about? Isn't this a fairly common problem?

3条回答
Root(大扎)
2楼-- · 2019-04-10 06:48

The situation with client side HTTP caches in Java is not particularly good. It is a non-trivial problem that has not been attacked by most of the HTTP client library developers.

I think that is changing slowly, but I cannot provide a definite pointer. A good way to start is to look at the various implementations of JAX-RS that come with a client side API such as Jersey (this has no client side cache). It might be that Restlet has one or Restfulie, please check.

Here is something I found via Google:

http://xircles.codehaus.org/projects/httpcache4j

You can also try to roll your own but you have to be careful to understand the caching headers (including Vary:) to get it right.

查看更多
聊天终结者
3楼-- · 2019-04-10 06:49

The 4.0+ version of the Apache HttpComponents library comes with HTTP 1.1 cache support. You can use this with the Spring RestTemplate restful client as follows:

    CacheConfig cacheConfig = new CacheConfig();  
    cacheConfig.setMaxCacheEntries(1000);
    cacheConfig.setMaxObjectSize(8192);

    HttpClient cachingClient = new CachingHttpClient(new DefaultHttpClient(), cacheConfig);

    ClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(cachingClient);
    RestTemplate rest = new RestTemplate(requestFactory);
查看更多
SAY GOODBYE
4楼-- · 2019-04-10 06:56

RestEasy features a client side caching mechanism which is trivial to get up and running if you are using such client.

RegisterBuiltin.register(ResteasyProviderFactory.getInstance());
YourService proxy = ProxyFactory.create(YourService.class, url);

LightweightBrowserCache cache = CacheFactory.makeCacheable(proxy);

You first create a client proxy instance, then wrap it around the cache. That's it.

查看更多
登录 后发表回答