Problema
Nei messaggi di registro AEM error.log riportare Rilevate sessioni non chiuse. Per esempio, nellʼesempio sotto [1] si può vedere una perdita di sessione in questo codice:
com.day.cq.dam.scene7.impl.listener.Scene7AssetActivationListener.searchViewerWidgets(Scene7AssetActivationListener.java:306)
In questo caso, la perdita di sessioni ha origine dalla creazione di un ResourceResolver amministrativo:
org.apache.sling.resourceresolver.impl.ResourceResolverFactoryImpl.getAdministrativeResourceResolver(ResourceResolverFactoryImpl.java:107)
Tuttavia, lo stesso può accadere quando si apre una sessione amministrativa, un service resolver o una sessione di servizio.
[1] Esempio di perdita di sessione
WARN [Finalizer] org.apache.jackrabbit.core.SessionImpl Unclosed session detected. The session was opened here: java.lang.Exception: Stack Trace at org.apache.jackrabbit.core.SessionImpl.<init>(SessionImpl.java:222) at org.apache.jackrabbit.core.XASessionImpl.<init>(XASessionImpl.java:117) at com.day.crx.core.CRXSessionImpl.<init>(CRXSessionImpl.java:69) at com.day.crx.core.CRXRepositoryImpl.createSessionInstance(CRXRepositoryImpl.java:935) at org.apache.jackrabbit.core.RepositoryImpl.createSession(RepositoryImpl.java:959) at org.apache.jackrabbit.core.SessionFactory.createAdminSession(SessionFactory.java:42) at com.day.crx.sling.server.impl.SlingRepositoryWrapper.loginAdministrative(SlingRepositoryWrapper.java:76) at org.apache.sling.jcr.resource.internal.helper.jcr.JcrResourceProviderFactory.getResourceProviderInternal(JcrResourceProviderFactory.java:136) at org.apache.sling.jcr.resource.internal.helper.jcr.JcrResourceProviderFactory.getAdministrativeResourceProvider(JcrResourceProviderFactory.java:115) at org.apache.sling.resourceresolver.impl.tree.ResourceProviderFactoryHandler.login(ResourceProviderFactoryHandler.java:162) at org.apache.sling.resourceresolver.impl.tree.RootResourceProviderEntry.loginToRequiredFactories(RootResourceProviderEntry.java:95) at org.apache.sling.resourceresolver.impl.ResourceResolverFactoryImpl.getResourceResolverInternal(ResourceResolverFactoryImpl.java:98) at org.apache.sling.resourceresolver.impl.ResourceResolverFactoryImpl.getAdministrativeResourceResolver(ResourceResolverFactoryImpl.java:72) at org.apache.sling.resourceresolver.impl.helper.ResourceResolverContext.getResourceTypeResourceResolver(ResourceResolverContext.java:192) at org.apache.sling.resourceresolver.impl.helper.ResourceResolverContext.getParentResourceType(ResourceResolverContext.java:216) at org.apache.sling.resourceresolver.impl.ResourceResolverImpl.getParentResourceType(ResourceResolverImpl.java:1136) at org.apache.sling.resourceresolver.impl.ResourceResolverImpl.getParentResourceType(ResourceResolverImpl.java:1126) at org.apache.sling.resourceresolver.impl.ResourceResolverImpl.isResourceType(ResourceResolverImpl.java:1151) at org.apache.sling.api.resource.AbstractResource.isResourceType(AbstractResource.java:115) at com.day.cq.dam.scene7.impl.listener.Scene7AssetActivationListener.searchViewerWidgets(Scene7AssetActivationListener.java:306)
Risoluzione
Se il codice che crea la sessione è un codice prodotto AEM, Sling o Oak, bisogna contattare il Servizio Clienti AEM.
Se è in codice personalizzato, la soluzione è quella di uscire dalla sessione o chiudere il ResourceResolver quando si ha finito di usarlo.
Esempio di sessione aperta e chiusa:
Session session = null; try { session = repository.getService("readService",null); // use session } finally { if(session != null && session.isLive()) { session.logout(); } }
Esempio di apertura e chiusura di ResourceResolver:
ResourceResolver resolver = null; try { resolver = resourceFactory.getServiceResourceResolver(paramMap); // use resolver } finally { if(resolver != null && resolver.isLive()){ resolver.close(); } }