2012-04-24 11 views
5

Sto tentando di memorizzare le risposte HTTP utilizzando cachingHttpClient, ma invano. Questa è la demo che ho messo insieme facendo riferimento a questo link, http://hc.apache.org/httpcomponents-client-ga/tutorial/html/caching.htmlNon è possibile memorizzare HttpResponse utilizzando cachingHttpClient in java?

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; 
     } 
    } 

    } 

Il suo un programma semplice, ma sono in grado di capire dove sto andando male. Il tuo aiuto sarebbe apprezzato. Grazie.

+0

Cosa ti aspetti che accada e che cosa accada realmente? – artbristol

+0

@artbristol Voglio un colpo di cache quando viene inviata la stessa richiesta http la seconda volta. Se esegui questo esempio, si verificano entrambi gli errori di cache. – FireAndIce

risposta

4

La richiesta GET con l'url http://www.mydomain.com/content/ termina con il codice Http 404 (non trovato). Probabilmente questo risultato non può essere memorizzato nella cache, quindi è per questo che non funziona per te, immagino.

UPDATE: Ci devono essere soddisfatte determinate condizioni al fine di servire la risposta dalla cache. È necessario abilitare la registrazione del client http di apache (ad esempio http://hc.apache.org/httpclient-3.x/logging.html). Di quanto tu possa eseguire il debug di cosa sta succedendo e perché ci sono errori di cache per gli altri tuoi URL. Probabilmente dovresti scaricare anche il codice sorgente della libreria e dare un'occhiata (http://hc.apache.org/downloads.cgi). Soprattutto ti interesserà la classe org.apache.http.impl.client.cache.CachedResponseSuitabilityChecker. Questo dovrebbe aiutarti anche nel tuo successivo sviluppo con la libreria.

Btw. http://muvireviews.com/celebrity/full_view/41/Shahrukh-khan tornare questa intestazione:

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

e per l'istruzione if in CachedResponseSuitabilityChecker:

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

non verrà utilizzata la cache.

Buona fortuna;)

+0

ok, quindi prima ho sostituito l'url con http://www.hellomagazine.com/royalty/201204247845/queen-royal-wedding-kate-middleton/ e mi ha dato un colpo di cache. Ma una volta sostituito con http://www.muvireviews.com/celebrity/full_view/41/Shahrukh-khan, c'è un errore di cache. – FireAndIce

+0

@HarshalKshatriya Guarda la risposta aggiornata. Spero che ti dia una risposta alla tua prossima domanda. –

+0

Grazie per l'aiuto. Cercherò di tornare indietro se ci sono problemi. – FireAndIce

0

Per impostazione predefinita CachingHttpClient assumere cache condivisa in tal modo ignora per memorizzare se intestazione di risposta contiene "Cache-Control: private" (nel tuo caso penso che è quello che è il caso). Vedere @https://hc.apache.org/httpcomponents-client-ga/tutorial/html/caching.html (Sezione # 6.4 Configurazione)

Provate a spegnerlo, in modo da essere in grado di utilizzare in modalità client solo cioè

CacheConfig cacheConfig = new CacheConfig(); 
cacheConfig.setMaxCacheEntries(1000); 
cacheConfig.setMaxObjectSizeBytes(1024 * 1024); 
cacheConfig .setSharedCache(false); // Turn it OFF here 

Questo ha funzionato per me. In bocca al lupo !!!

+0

Qualsiasi idea su come cache 'Cache-control => private, must-revalidate, max-age = 0'. Grazie. – rraallvv

Problemi correlati