Le service de cache simplifie l'intégration de cache de données issues de web-service.

En particulier, il permet de :

  • Mutualiser les appels aux web-services pour des profils d'utilisateur (un seul appel par groupe d'utilisateur)
  • Maintenir des données en session pour un utilisateur donné
  • Stocker les données de paramétrage (ex : les vocabulaires Nuxeo)
  • Servir les données en cache lorsque le web-sevice devient inopérant

Le service de cache est essentiellement utilisé pour les appels Nuxeo

Instanciation du service de cache

Le service de cache est injecté dans les portlets. Pour récupérer le service, procéder comme suit

private ICacheService serviceCache;

	@Override
	public void init(PortletConfig config) throws PortletException 
	{
		super.init(config);

		
		serviceCache = (ICacheService) getPortletContext().getAttribute("CacheService");
		if (serviceCache == null) {
			throw new PortletException("Cannot start portlet due to service unavailability");
		}

	}

Mise en place d'un cache

La mise à jour cache repose sur un pattern commande. La commande de mise à jour du cache est définie dans un invoker. Cet invoker sera appelé uniquement lors de la mise à jour du cache, si celle si est nécessaire :

public class DynamicCacheInvoker implements IServiceInvoker {

	public Object invoke() throws Exception {
		return cacheDatas;
	}

Cet invoker est référencé dans un objet cacheInfo. Cet objet définit les paramètres d'appel du cache, à savoir :

  • la clé associée au cache
  • le scope du cache
  • l'invoker si le cache doit être recalculé
  • le temps d'expiration du cache
CacheInfo cacheInfos = new CacheInfo( cacheKey, CacheInfo.CACHE_SCOPE_PORTLET_CONTEXT,
					dynamicInvoker, null, getPortletContext(), false);

content = (PortletContent) serviceCache.getCache(cacheInfos);

Cas de service indisponible

Actuellement, la gestion est transparente : si l'invoker échoue, l'erreur est remontée à l'appelant, et c'est le rôle de l'appelant d'aller chercher l'information dans le cache (mode ForceNOTReload).

cacheInfos.setForceNOTReload(true);

content = (PortletContent) serviceCache.getCache(cacheInfos);

if (content != null) {
....
}

Si le service est indisponible temporairement, il est possible de rafraichir explicitement la validité du cache, afin d'éviter des appels en erreur. Pour cela, il faut mettre à jour le cache via un Invoker spécifique (qui contient la donnée du cache) et préciser le paramètre ForceReload

staticCacheInfos.setInvoker( StaticInvoker);
cacheInfos.setForceReload(true);

(PortletContent) serviceCache.getCache(staticCacheInfos);