Le cache de Guava- Partie 2

Nous poursuivons ici ce billet. La démo 2 est présentée avec détails.

Dans ces démos, nous donnons deux façons pratiques afin de mieux gérer le cache de Guava.

  • La première s'appuie les interfaces LoadingCache et CacheLoader
  • La seconde fait appel à l'interface Callable.

Nous partons du projet de la première partie de ce billet.

Nous allons le compléter et l'adapter au fur et à mesure pour construire les démos.

Passons à la mise en pratique.

DEMO2. Utilisation des interfaces LoadingCache et CacheLoader

1.A) Modification de l'interface DestinationCacheManager

Désormais la seule méthode utile est la méthode get.

public interface DestinationCacheManager {
	 Destination get(String key) throws ExecutionException ;
}

Notez que la méthode get lève une exception.

Aussi que la méthode put n'est plus utile.

1.B) L'implémentation de cette interface est nommée DestinationCacheManagerImpl:

package fr.netapsys.gestioncacheguava.services;
import java.util.concurrent.*;
import javax.annotation.PostConstruct;
import org.springframework.stereotype.Component;
import com.google.common.cache.*;
import fr.netapsys.gestioncacheguava.model.Destination;
@Component
public class DestinationCacheManagerImpl 
      implements DestinationCacheManager{
 private LoadingCache<String,Destination> cache;
 @PostConstruct
 public void init(){
	cache = CacheBuilder.newBuilder().
 	  maximumSize(10).
	  expireAfterWrite(1, TimeUnit.MINUTES).  
	  build( 
      	    new CacheLoader<String, Destination>() {
	    @Override
	     public Destination load(String key) throws Exception {
	      return getFavoriteDestination(key);//simule appel service 
	     }
	   }
	 );
	}
	public Destination get(String key) throws ExecutionException {
	  return cache.get(key);
	}
   //Simule l'appel an service qui genere la destination favorite 
    private Destination getFavoriteDestination(String key) {
	Destination destDispo=new Destination();
	destDispo.setLibelle("destFavorite");
	destDispo.setVille("PARIS");
	destDispo.setPays("FRANCE");
	destDispo.setCritere("C"+key);
	return destDispo;
   }
}

Explications:

Quelques modifications majeures sont à observer:

  • Le cache est de type LoadingCache. Et on utilise la méthode V get(K,V) throws ExecutionException,
  • Nous passons à la méthode build du CacheBuilder un objet anonyme de type CacheLoader.

Ceci permet donc d'appeler un service pour initialiser les éléments du cache.

1.C) Test unitaire

Voici le code du test unitaire :

package fr.netapsys.testscache;
import java.util.concurrent.ExecutionException;
import org.junit.*;
import org.springframework.beans.factory.annotation.Autowired;
import fr.netapsys.gestioncacheguava.model.Destination;
import fr.netapsys.gestioncacheguava.services.DestinationCacheManager;
public class TestDestinationCache extends TestParent {
  @Autowired DestinationCacheManager dcm;
  @Test
  public void testCacheLoader() throws ExecutionException  {
	// get from cache
 	Destination d=dcm.get("destFavorite");
 	Assert.assertNotNull(d);
	Assert.assertEquals(d.getLibelle(),"destFavorite"  );	
  }

@Test
	public void test2() throws ExecutionException  {
		// get from cache
		Destination d1=dcm.get("destSuper");
		Assert.assertNotNull(d1);
		Assert.assertEquals(d1.getCritere(),"CdestSuper"  );
	}
}

C'est simple non?
Le (Laoding)Cache est initialisé via la méthode init annotée avec @PostConstruct qui
appelle la méthode statique build en lui passant comme argument une instance de CacheLoader.
Le test unitaire définit une instance DestinationCacheManager nommée dcm et injectée par Spring.
Les deux méthode du test montrent que cette instance permet, via la méthode get, de récupérer du cache la destination ayant la bonne clé.

DEMO3. Utilisation de l'interface Callable

La prochaine partie détaille la démo3 basée sur les Callable.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Captcha *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.