Les expulseurs sont associés à des instances BackingMap.
import com.ibm.websphere.objectgrid.ObjectGridManagerFactory;
import com.ibm.websphere.objectgrid.ObjectGridManager;
import com.ibm.websphere.objectgrid.ObjectGrid;
import com.ibm.websphere.objectgrid.BackingMap;
import com.ibm.websphere.objectgrid.TTLType;
ObjectGridManager ogManager = ObjectGridManagerFactory.getObjectGridManager();
ObjectGrid og = ogManager.createObjectGrid( "grid" );
BackingMap bm = og.defineMap( "myMap" );
bm.setTtlEvictorType( TTLType.CREATION_TIME );
bm.setTimeToLive( 600 );
L'argument de la méthode setTimeToLive est 600 car cela indique la valeur de durée de vie en secondes. Le code précédent doit être exécuté avant l'appel de la méthode d'initialisation sur l'instance ObjectGrid. Ces attributs BackingMap ne peuvent pas être modifiés une fois que l'instance ObjectGrid est initialisée. Une fois que le code est exécuté, une entrée insérée dans BackingMap myMap possède un délai d'expiration. Une fois ce délai expiré, l'expulseur basé sur la durée de vie supprime l'entrée.
Pour définir un délai d'expiration à la date du dernier accès plus 10 minutes, changez l'argument qui est passé à la méthode setTtlEvictorType de TTLType.CREATION_TIME à TTLType.LAST_ACCESS_TIME. Avec cette valeur, le délai d'expiration équivaut à la date du dernier accès plus 10 minutes. Quand une entrée vient d'être créée, sa date de dernier accès est sa date de création. Pour baser l'heure de l'expiration sur la dernière modification au lieu de se contenter du dernier accès (qu'une modification ait eu effectivement lieu ou non), remplacez le paramètre TTLType.LAST_ACCESS_TIME par TTLType.LAST_UPDATE_TIME.
Lorsque vous utilisez TTLType.LAST_ACCESS_TIME ou TTLType.LAST_UPDATE_TIME, vous pouvez utiliser les interfaces ObjectMap et JavaMap pour que celles-ci substituent leur propre valeur de durée de vie de la mappe de sauvegarde. Ce mécanisme autorise une application à utiliser une valeur de durée de vie différente pour chaque entrée créée. Partons du principe que le fragment de code précédent définit l'attribut ttlType sur LAST_ACCESS_TIME et la valeur de durée de vie sur 10 minutes. Une application peut substituer sa propre valeur de durée de vie pour chacune des entrées en exécutant le code suivant avant de créer ou de modifier l'entrée :
import com.ibm.websphere.objectgrid.Session;
import com.ibm.websphere.objectgrid.ObjectMap;
Session session = og.getSession();
ObjectMap om = session.getMap( "myMap" );
int oldTimeToLive1 = om.setTimeToLive( 1800 );
om.insert("key1", "value1" );
int oldTimeToLive2 = om.setTimeToLive( 1200 );
om.insert("key2", "value2" );
Dans le fragment de code précédent, l'entrée avec la clé key1 a un délai d'expiration basé sur la date d'insertion plus 30 minutes en raison de l'appel de la méthode setTimeToLive( 1800 ) sur l'instance ObjectMap. La variable oldTimeToLive1 est définie sur 600 car la valeur de durée de vie de BackingMap est utilisée comme variable par défaut si la méthode setTimeToLive n'a pas été appelée précédemment sur l'instance ObjectMap.
L'entrée avec la clé key2 a un délai d'expiration basé sur la date d'insertion plus 20 minutes en raison de l'appel de la méthode setTimeToLive( 1200 ) sur l'instance ObjectMap. La variable oldTimeToLive2 est définie sur 1800 car la valeur de durée de vie de l'appel précédent de la méthode ObjectMap.setTimeToLive définit cette valeur sur 1800.
Les exemples précédents montrent l'insertion de deux entrées de mappe dans la mappe myMap pour les clés key1 et key2. Plus tard, l'application peut toujours mettre à jour ces entrées de mappe tout en conservant les valeurs de durée de vie utilisées au moment de l'insertion pour chaque entrée de mappe. L'exemple suivant illustre comment conserver les valeurs de durée de vie, en utilisant une constante définie dans l'interface ObjectMap:
Session session = og.getSession();
ObjectMap om = session.getMap( "myMap" );
om.setTimeToLive( ObjectMap.USE_DEFAULT );
session.begin();
om.update("key1", "updated value1" );
om.update("key2", "updated value2" );
om.insert("key3", "value3" );
session.commit();
Comme la valeur spéciale ObjectMap.USE_DEFAULT est utilisée sur l'appel de la méthode setTimeToLive, la clé key1 conserve sa valeur de 1800 secondes et la clé key2 conserve la sienne de 1200 secondes, car ces valeurs on été utilisées quand les entrées de mappe ont été insérées par la transaction précédente.
L'exemple précédent montre également une nouvelle entrée de mappe pour l'insertion de la clé key3. Dans ce cas, la valeur spéciale USE_DEFAULT indique d'utiliser le paramètre par défaut de valeur de durée de vie pour cette mappe. La valeur par défaut est définie par l'attribut BackingMap de durée de vie. Voir Les attributs de l'interface BackingMap pour en savoir plus sur la manière dont est redéfini l'attribut de durée de vie sur l'instance BackingMap.
Voir la documentation d'API pour la méthode setTimeToLive sur les interfaces ObjectMap et JavaMap. La documentation explique qu'une exception IllegalStateException survient si la méthode BackingMap.getTtlEvictorType renvoie autre chose que la valeur TTLType.LAST_ACCESS_TIME ou TTLType.LAST_UPDATE_TIME. Les interfaces ObjectMap et JavaMap ne peuvent substituer la valeur de durée de vie que lorsqu'on utilise le paramètre LAST_ACCESS_TIME ou TTLType.LAST_UPDATE_TIME pour le type d'expulseur TTL. La méthode setTimeToLive ne peut pas être utilisée pour substituer sa propre valeur de durée de vie lorsqu'on utilise les paramètres CREATION_TIME ou NONE.
Les expulseurs étant associés à des mappes de sauvegarde, l'interface BackingMap permet de spécifier l'expulseur à connecter. Le fragment de code qui suit montre comment spécifier un expulseur LRUEvictor pour la mappe de sauvegarde map1 et un expulseur LFUEvictor pour l'instance BackingMap map2 :
import com.ibm.websphere.objectgrid.ObjectGridManagerFactory;
import com.ibm.websphere.objectgrid.ObjectGridManager;
import com.ibm.websphere.objectgrid.ObjectGrid;
import com.ibm.websphere.objectgrid.BackingMap;
import com.ibm.websphere.objectgrid.plugins.builtins.LRUEvictor;
import com.ibm.websphere.objectgrid.plugins.builtins.LFUEvictor;
ObjectGridManager ogManager = ObjectGridManagerFactory.getObjectGridManager();
ObjectGrid og = ogManager.createObjectGrid( "grid" );
BackingMap bm = og.defineMap( "map1" );
LRUEvictor evictor = new LRUEvictor();
evictor.setMaxSize(1000);
evictor.setSleepTime( 15 );
evictor.setNumberOfLRUQueues( 53 );
bm.setEvictor(evictor);
bm = og.defineMap("map2");
LFUEvictor evictor2 = new LFUEvictor();
evictor2.setMaxSize(2000);
evictor2.setSleepTime( 15 );
evictor2.setNumberOfHeaps( 211 );
bm.setEvictor(evictor2);
Le fragment de code montrait un expulseur LRUEvictor utilisé pour la mappe de sauvegarde map1 avec un nombre maximum d'entrées d'environ 53 000 (53 * 1000). L'expulseur LFUEvictor était utilisé pour la mappe de sauvegarde map2 avec un nombre maximum d'entrées d'à peu près 422 000 (211*2000). Les deux expulseurs LRU et LFU comportent une propriété SleepTime qui indique au bout de combien de temps l'expulseur doit s'éveiller pour vérifier s'il n'y a pas lieu d'expulser des entrées. Cette durée d'inactivité est spécifiée en secondes. 15 secondes est un bon compromis entre l'impact sur les performances et le souci d'empêcher la mappe de trop grossir. L'objectif est d'utiliser le délai d'inactivité le plus long possible sans que la mappe atteigne une taille excessive.
La méthode setNumberOfLRUQueues définit la propriété LRUEvictor qui indique combien de files d'attente LRU l'expulseur utilise pour gérer les informations LRU. Un ensemble de files d'attente est en effet utilisé pour éviter que chaque entrée ne conserve les informations LRU dans la même file. Cette approche permet d'améliorer les performances en réduisant le nombre d'entrées de mappe qui ont besoin de synchronisation dans le même objet queue. Augmenter le nombre de files d'attente est un bon moyen de réduire l'impact possible de l'expulseur LRU sur les performances. 10 % du nombre maximum d'entrées est un bon point de départ pour définir le nombre des files d'attente. En règle générale, il vaut mieux utiliser un nombre premier. La méthode setMaxSize indique combien d'entrées sont autorisées dans chaque file d'attente. Lorsqu'une file atteint son nombre maximum d'entrées, la ou les entrées les moins récemment utilisées dans cette file sont expulsées lors de la prochaine vérification par l'expulseur.
La méthode setNumberOfHeaps définit la propriété LFUEvictor qui indique combien d'objets binaires de segments de mémoire LFUEvictor utilise pour gérer les informations LFU. Ici aussi, un ensemble est utilisé afin d'améliorer les performances. Et ici aussi, 10 % du nombre d'entrées et un bon point de départ et il vaut mieux utiliser un nombre premier. La méthode setMaxSize indique combien d'entrées sont autorisées dans chaque segment de mémoire. Lorsqu'un segment de mémoire atteint son nombre maximum d'entrées, la ou les entrées les moins fréquemment utilisées dans ce segment sont expulsées lors de la prochaine vérification par l'expulseur.