Problem
Im AEM error.log-Protokollnachrichtenbericht nicht geschlossene Sitzungen erkannt. Beispielsweise können Sie im folgenden Beispiel [1] ein Sitzungsleck im folgenden Code sehen:
com.day.cq.dam.scene7.impl.listener.Scene7AssetActivationListener.searchViewerWidgets(Scene7AssetActivationListener.java:306)
In diesem Fall stammen die Sitzungslecks aus der Erstellung eines administrativen „ResourceResolver“:
org.apache.sling.resourceresolver.impl.ResourceResolverFactoryImpl.getAdministrativeResourceResolver(ResourceResolverFactoryImpl.java:107)
Dasselbe gilt jedoch beim Öffnen einer administrativen Sitzung, eines Service-Resolvers oder einer Servicesitzung.
[1] Beispielsitzungsleck
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)
Lösung
Wenn der Code, der die Sitzung erstellt, AEM, Sling oder Oak ist, wenden Sie sich an den AEM-Kundendienst.
Wenn es in einem benutzerdefiniertem Code ist, besteht die Lösung darin, sich aus der Sitzung abzumelden oder den „ResourceResolver“ zu schließen, wenn Sie damit fertig sind.
Beispiel für geöffnete und geschlossene Sitzungen:
Session session = null; try { session = repository.getService("readService",null); // use session } finally { if(session != null && session.isLive()) { session.logout(); } }
Beispiel für geöffnete und geschlossene „ResourceResolver“:
ResourceResolver resolver = null; try { resolver = resourceFactory.getServiceResourceResolver(paramMap); // use resolver } finally { if(resolver != null && resolver.isLive()){ resolver.close(); } }