2012-04-24 6 views
5

私はcachingHttpClientを使用してHTTP応答をキャッシュしようとしていますが、無駄です。 これは、私は、このリンクを参照のうえでまとめデモ、http://hc.apache.org/httpcomponents-client-ga/tutorial/html/caching.htmljavaのcachingHttpClientを使用してHttpResponseをキャッシュできませんか?

public class CacheDemo { 

    public static void main(String[] args) { 
     CacheConfig cacheConfig = new CacheConfig(); 
     cacheConfig.setMaxCacheEntries(1000); 
     cacheConfig.setMaxObjectSizeBytes(1024 * 1024); 

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

     HttpContext localContext = new BasicHttpContext(); 

     sendRequest(cachingClient, localContext); 
     CacheResponseStatus responseStatus = (CacheResponseStatus) localContext.getAttribute(
       CachingHttpClient.CACHE_RESPONSE_STATUS); 
     checkResponse(responseStatus); 


     sendRequest(cachingClient, localContext); 
     responseStatus = (CacheResponseStatus) localContext.getAttribute(
       CachingHttpClient.CACHE_RESPONSE_STATUS); 
     checkResponse(responseStatus); 
    } 

    static void sendRequest(HttpClient cachingClient, HttpContext localContext) { 
     HttpGet httpget = new HttpGet("http://www.mydomain.com/content/"); 
     HttpResponse response = null; 
     try { 
      response = cachingClient.execute(httpget, localContext); 
     } catch (ClientProtocolException e1) { 
      // TODO Auto-generated catch block 
      e1.printStackTrace(); 
     } catch (IOException e1) { 
      // TODO Auto-generated catch block 
      e1.printStackTrace(); 
     } 
     HttpEntity entity = response.getEntity(); 
     try { 
      EntityUtils.consume(entity); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

    } 

    static void checkResponse(CacheResponseStatus responseStatus) { 
     switch (responseStatus) { 
      case CACHE_HIT: 
       System.out.println("A response was generated from the cache with no requests " 
         + "sent upstream"); 
       break; 
      case CACHE_MODULE_RESPONSE: 
       System.out.println("The response was generated directly by the caching module"); 
       break; 
      case CACHE_MISS: 
       System.out.println("The response came from an upstream server"); 
       break; 
      case VALIDATED: 
       System.out.println("The response was generated from the cache after validating " 
         + "the entry with the origin server"); 
       break; 
     } 
    } 

    } 

そのシンプルなプログラムですが、私は間違っているつもり場所を把握することができませんでしだ。あなたの助けに感謝します。ありがとう。

+0

実際に何が起こると思われますか? – artbristol

+0

@artbristol同じHTTP要求が2回目に送信されたときにキャッシュヒットします。この例を実行すると、両方のタイムキャッシュミスが発生します。 – FireAndIce

答えて

4

url http://www.mydomain.com/content/でのGETリクエストは、HTTP 404コード(見つかりません)で終了します。この結果はキャッシュされていない可能性が高いので、それは私が推測するように動作しません。

更新: キャッシュからの応答を処理するには、一定の条件を満たす必要があります。 apache httpクライアントのログを有効にする必要があります(例:http://hc.apache.org/httpclient-3.x/logging.html)。何が起こっているのか、他のURLにはキャッシュミスがあるのか​​をデバッグするよりも簡単です。おそらくライブラリのソースコードもダウンロードして見てください(http://hc.apache.org/downloads.cgi)。特にorg.apache.http.impl.client.cache.CachedResponseSuitabilityCheckerクラスに興味があります。これは、ライブラリを使用した次の開発においても役立ちます。

Btw。このヘッダを返すhttp://muvireviews.com/celebrity/full_view/41/Shahrukh-khan

Cache-Control:no-store, no-cache, must-revalidate, post-check=0, pre-check=0, max-age=0, no-cache, no-store

と理由CachedResponseSuitabilityCheckerにおけるif文の:

  if (HeaderConstants.CACHE_CONTROL_NO_CACHE.equals(elt.getName())) { 
       log.trace("Response contained NO CACHE directive, cache was not suitable"); 
       return false; 
      } 

キャッシュは使用されません。 「:民間のCache-Controlの」(あなたのケースで、私はそのような場合は何だと思います)。

幸運デフォルト)

+0

大丈夫ですので、最初にURLをhttp://www.hellomagazine.com/royalty/201204247845/queen-royal-wedding-kate-middleton/に置き換え、キャッシュヒットしました。しかし、http://www.muvireviews.com/celebrity/full_view/41/Shahrukh-khanに置き換えられると、キャッシュミスが発生します。 – FireAndIce

+0

@HarshalKshatriya更新された答えを見てください。私はあなたに次の質問への答えを与えることを願っています。 –

+0

助けてくれてありがとう。何か問題があれば、私はやり直して元に戻します。 – FireAndIce

0

は、それによって、レスポンスヘッダが含まれている場合は保存するために無視する共有キャッシュを想定CachingHttpClient。 https://hc.apache.org/httpcomponents-client-ga/tutorial/html/caching.html(セクション#6.4の構成)クライアントで使用できるように、それをオフにする

てみ@を参照してくださいのみのモード、すなわち

これは私のために働いた
CacheConfig cacheConfig = new CacheConfig(); 
cacheConfig.setMaxCacheEntries(1000); 
cacheConfig.setMaxObjectSizeBytes(1024 * 1024); 
cacheConfig .setSharedCache(false); // Turn it OFF here 

。がんばろう !!!

+0

'Cache-control => private、must-revalidate、max-age = 0'をキャッシュする方法はありません。ありがとう。 – rraallvv

関連する問題