1. Introduction
JCMS offre une fonctionnalité de cache pour les éléments de portail afin d'obtenir des performances proches d'un site statique. Cet article décrit le fonctionnement de ces caches et leur paramétrage.
2. Principes de fonctionnement
Dans JCMS, chaque cache est associé à une portlet. Une page peut donc comporter plusieurs caches qui stockent chacun une portion du HTML de la page. Un cache appliqué sur une portlet Ligne ou une portlet Colonne portera sur toutes les portlets composant la ligne ou la colonne. Selon leur type, les caches sont stockés en mémoire ou sur disque. Le rafraîchissement des caches peut être temporel ou événementiel. Enfin, il est possible de paramétrer la portée d'un cache selon les données qu'il contient.
3. Types de Cache
On distingue deux familles de cache :
Les caches "globaux", destinés aux parties communes du site.
Fréquemment utilisées et généralement peu nombreux, ils sont stockés en mémoire. Ce sont les caches les plus performants.
Ils sont appelés "caches globaux" (ou anciennement cache "serveur") car communs à l'ensemble des visiteurs.
Le nombre de caches globaux conservés en mémoire est limité par la propriété "cache-mgr.max-servers-cache-nbr", en conservant en priorité les caches qui sont utilisés fréquemments (LRU). Cette valeur est fixé par défaut à 1000 entrées, augmenter cette valeur améliorera les performances au détriment de la consommation mémoire.
Les caches "sessions" destinés aux parties personnalisées du site.
Ils sont propres à la session d'un utilisateur. Comme ils peuvent être nombreux (autant que de sessions ouvertes), ils sont stockés sur disque. Ils sont destinés à mettre en cache des informations personnalisé pour le lecteur La durée de vie de ces caches dépend du paramétrage de l'invalidation (temporelle ou événementielle) mais aussi de la durée de la session utilisateur (généralement 30 minutes). Ces caches sont moins efficaces que les caches "Globaux" car ils ne sont efficaces qu'à partir du second accès de l'utilisateur lors de chaque nouvelle session.
Ils sont appelés "caches sessions" car dépendant de la session utilisateur.
Il existe 6 types de cache pour une Portlet :
- Cache global

Ce cache sera commun à toutes les requêtes.
? A utiliser sur les portlets dont le contenu est identique pour tous les utilisateurs. - Cache par session J2EE

Un caches sessions sera créé pour chaque session J2EE - Cache par sessions de membre, et global pour les visiteurs
(depuis JCMS 5.5)
Il s'agit d'un cache par session J2EE lorsque un membre est identifié, et d'un cache global pour tous les autres visiteurs du site
? A utiliser sur les portlets dont le contenu est identique lorsque l'utilisateur n'est pas encore connecté, et dont le contenu sera personnalisé après connexion. - Cache global pour les visiteurs uniquement
(depuis JCMS 5.5)
Ce type de cache n'est actif que pour les visiteurs du site, ils bénéficient alors d'un cache global.
? A utiliser sur les portlets dont le contenu est identique lorsque l'utilisateur n'est pas encore connecté. Mais dont le contenu personnalisé après connexion serait trop lourd à cacher en mémoire. - Cache par groupe

Déduit à partir des groupes auxquels appartient le membre identifié, tous les membres appartenant exactement aux même groupes bénéficieront de ce cache. - Cache par membre

Les caches sont communs à toutes les sessions J2EE d'un membre identifié.
4. Affinement
Il est possible d'affiner les caches en fonction de la catégorie du portail ou de la catégorie courante. La portée du cache est alors fonction de la catégorie consultée. Cet affinement doit être activé pour les portlets Requête/Itération ou les portlets Navigation utilisant elles aussi une méthode d'affinement.

5. Rafraîchissement des caches
Plusieurs techniques permettent le rafraîchissement des caches afin d'éviter aux utilisateurs la visualisation d'informations obsolètes. Le rafraîchissement consiste à mettre à jour le contenu du cache.
5.1 Rafraîchissement temporel
Les caches peuvent être rafraîchis au bout d'un certain temps. A partir de JCMS 4.1.1, il s'agit d'un rafraîchissement retardé, c'est-à-dire que le rafraîchissement du cache n'a lieu que lorsqu'il est réinterrogé.
5.2 Rafraîchissement événementiel
Les caches peuvent être rafraîchis en fonction des création/suppression/modification des objets d'un certain type de données. C'est typiquement ce type de rafraîchissement que l'on choisira pour une portlet Requête/Itération. Pour éviter des rafraîchissements inutile, seuls les publications dans un état visible (i.e. dans l'état Publié) sont pris en compte. Ceci implique que la portlet Workflow (qui présente des contenus dans des états non visibles) ne doit pas utiliser ce type de rafraîchissement.
6. Désactivation des caches
Dans certaines conditions un cache peut être désactivé. Dans ce cas, il n'est ni utilisé ni rafraîchi. Par ailleurs, si lorsque le cache d'une portlet est désactivé, tous les caches des portlets contenant cette portlet le sont aussi.
6.1 Portlet Sélection (FullDisplay)
Le cache d'une portlet Sélection (ou de toute portlet implémentant l'interface FullDisplay) est désactivé si la requête contient les paramètres "jsp" ou "portlet", ou qu'une publication est en attribut de requête. En conséquence, les éléments (JSP, portlet ou publication) affichés en FullDisplay ne sont pas mis en cache.
6.2 Actions de portlet
Une portlet peut proposer à l'utilisateur des actions qui altèrent son contenu. C'est par exemple le cas de la portlet Calendrier qui permet le changement du mois ou d'une portlet Requête/Itération comportant une pagination. Ces actions de portlet (changement de mois, changement de page) désactivent automatiquement le cache de la portlet.
6.3 Rédacteurs
Si un utilisateur à la possibilité d'éditer ou publier un contenu (i.e. un rédacteur), tous les caches serveurs seront désactivés si les icônes d'édition sont visibles (paramétrable dans les Propriétés).
6.4 Edition du portail
Enfin, lorsqu'on est en mode édition du portail, tous les caches sont désactivés.



