¿Qué es un ResourceResolver de Sling?
Cómo el ResourceResolver de Sling mapea contenido JCR a Resources, por qué hay que cerrarlo, y cómo se producen las fugas en AEM.
Un ResourceResolver es la API de Apache Sling para resolver una ruta (o una
petición) en un Resource. Se apoya sobre una Session de JCR y es la forma
principal en la que el código de AEM lee y escribe contenido.
Por qué hay que cerrarlo
Todo ResourceResolver obtenido de un ResourceResolverFactory envuelve una
sesión JCR viva. Si no lo cierras, la sesión subyacente — y los recursos que
mantiene (locks, cachés, listeners) — sigue viva hasta que el recolector de
basura la detecta, lo que en una instancia de author o publish con tráfico
puede significar miles de sesiones filtradas y, con el tiempo,
un OutOfMemoryError.
try (ResourceResolver resolver = resolverFactory.getServiceResourceResolver(params)) {
Resource page = resolver.getResource("/content/we-retail/us/en");
// trabajar con el resource
} // resolver.close() se llama automáticamente
Adquiere siempre un ResourceResolver dentro de un bloque try-with-resources
(o un finally equivalente). Esta es la causa más común de fugas de recursos
en código custom de AEM.
Dónde suele aparecer
- Jobs programados (servicios
Runnable/Scheduler) que crean un resolver pero nunca lo cierran en un camino de retorno anticipado. - Sling Models que guardan un resolver como campo en lugar de tomarlo prestado por petición.
- Manejadores de eventos que abren un resolver dentro de un bucle en vez de reutilizar uno.