Cos'è un ResourceResolver di Sling?
Come il ResourceResolver di Sling mappa i contenuti JCR in Resource, perché va chiuso e come si generano i leak in AEM.
Un ResourceResolver è l’API di Apache Sling per risolvere un percorso (o una
richiesta) in una Resource. Si appoggia su una Session JCR ed è il modo
principale con cui il codice AEM legge e scrive contenuti.
Perché va chiuso
Ogni ResourceResolver ottenuto da un ResourceResolverFactory racchiude una
sessione JCR attiva. Se non lo chiudi, la sessione sottostante — e le risorse
che mantiene (lock, cache, listener) — resta viva finché il garbage collector
non se ne accorge, il che su un’istanza author o publish sotto carico può
significare migliaia di sessioni perse e, alla lunga, un OutOfMemoryError.
try (ResourceResolver resolver = resolverFactory.getServiceResourceResolver(params)) {
Resource page = resolver.getResource("/content/we-retail/us/en");
// lavora con la resource
} // resolver.close() viene chiamato automaticamente
Acquisisci sempre un ResourceResolver all’interno di un blocco
try-with-resources (o un finally equivalente). È la causa più comune di
leak di risorse nel codice custom di AEM.
Dove capita più spesso
- Job pianificati (servizi
Runnable/Scheduler) che creano un resolver ma non lo chiudono mai in un percorso di ritorno anticipato. - Sling Model che salvano un resolver come campo invece di prenderne uno in prestito per ogni richiesta.
- Event handler che aprono un resolver dentro un ciclo invece di riutilizzarne uno solo.