2012-04-24 7 views
5

मैं कैश HTTP cachingHttpClient का उपयोग कर प्रतिक्रियाओं के लिए कोशिश कर रहा हूँ, लेकिन व्यर्थ। इस डेमो जो मैं इस लिंक की बात कर रहा द्वारा एक साथ रखा, http://hc.apache.org/httpcomponents-client-ga/tutorial/html/caching.htmlनहीं जावा में 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 अनुरोध दूसरी बार भेजा जाता है। यदि आप इस उदाहरण को चलाते हैं, तो दोनों बार कैश मिस होती है। – FireAndIce

उत्तर

4

HTTP 404 कोड के साथ खत्म हो जाएगा यूआरएल http://www.mydomain.com/content/ साथ GET अनुरोध (नहीं मिला)। यह परिणाम कैश किए जाने की अधिक संभावना नहीं हो सकती है, इसलिए यही कारण है कि यह आपके लिए काम नहीं करता है।

अद्यतन: कुछ शर्तों के कैश से प्रतिक्रिया सेवा करने के लिए मुलाकात की होनी चाहिए। आप Apache HTTP ग्राहक की लॉगिंग (जैसे http://hc.apache.org/httpclient-3.x/logging.html) सक्षम होना चाहिए। आप क्या कर रहे हैं डीबग कर सकते हैं और आपके अन्य यूआरएल के लिए कैश मिस क्यों हैं। आपको शायद लाइब्रेरी का स्रोत कोड भी डाउनलोड करना चाहिए और वहां एक नज़र डालें (http://hc.apache.org/downloads.cgi)। खासकर आपको org.apache.http.impl.client.cache.CachedResponseSuitabilityChecker कक्षा में रुचि होगी। यह पुस्तकालय के साथ आपके निम्नलिखित विकास में भी आपकी मदद करनी चाहिए।

बीटीडब्ल्यू।

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

और अगर बयान की वजह से CachedResponseSuitabilityChecker में:

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

कैश उपयोग नहीं किया जाएगा http://muvireviews.com/celebrity/full_view/41/Shahrukh-khan इस हेडर वापस जाएँ।

गुड लक;)

+0

ठीक है, तो पहले मैंने यूआरएल को http://www.hellomagazine.com/royalty/201204247845/queen-royal-wedding-kate-middleton/ के साथ बदल दिया और यह मुझे एक कैश हिट दिया। लेकिन जब http://www.muvireviews.com/celebrity/full_view/41/Shahrukh-khan के साथ बदल दिया है, वहाँ एक कैश याद आती है। – FireAndIce

+0

@ हर्षल क्षत्रिय अद्यतन अद्यतन पर नजर डालें। मुझे आशा है कि यह आपको आपके अगले प्रश्न का उत्तर देगा। –

+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

कोई भी विचार कैश-कंट्रोल => कैश कैश करने के लिए कैसे करें, निजी, अनिवार्य, अधिकतम आयु = 0'। धन्यवाद। – rraallvv

संबंधित मुद्दे