Überprüfen Sie, ob Ihre AEM6.x-Anwendung ein JCR-Sitzungsleck aufweist, und verfolgen Sie die Quelle nach unten.
Umgebung
AEM 6.4,6.5
Schritte
I. ÜBERPRÜFEN, OB EIN SITZUNGSLÖSCHEN BESTEHT
Gehen Sie zu http://host:port/system/console/jmx and melden Sie sich als Administrator an.
Verwenden Sie die Suchfunktion des Browsers, um alle Vorkommen von SessionStatistics-Objekten auf der Seite zu finden.
Wenn Sie über 500 finden, dann gibt es ein Sitzungsleck.
II. IDENTIFIZIEREN DES CODES, DER SITZUNGEN AUSLÖST
Wenn Sie ein Sitzungsleck gefunden haben, führen Sie die folgenden Schritte aus, um zu finden, was es verursacht.
Scrollen Sie auf der Seite nach unten zu den SessionStatistics-Objekten.
Öffnen Sie einige der SessionStatistics-Objekte in einer neuen Browser-Registerkarte durch [Strg]+Klicken auf einige die einen späteren Zeitstempel oder eine höhere ID-Nummer aufweisen. Beispielsweise hat das unten stehende Objekt die ID
12105:org.apache.jackrabbit.oak "SessionStatistics" "admin@session-12105@Aug 10, 2020 7:03:25 Uhr" {id=287}. Je höher die ID-Nummer, desto später wurde die Sitzung nach dem letzten AEM Neustart erstellt.
Überprüfen Sie die Stacktraces, die zeigen, welcher Code diese Sitzungen geöffnet hat.
Suchen Sie im Stapel nach Anwendungs-Java-Paketen. Wenn der Code Teil Ihrer Anwendung ist, lesen Sie den nächsten Abschnitt unten.
III. FEHLERKORREKTUR DES SITZUNGSLÖSCHS
So verhindern und beheben Sie JCR-Sitzungslecks:
Wenn Sie eine javax.jcr.Session in Ihrem Code speichern, schließen Sie ihn dann immer über Session.logout()
Wenn Sie eine org.apache.sling.api.resource.ResourceResolver in Ihrem Code speichern, schließen Sie ihn dann immer über ResourceResolver.close()
Schließen von Sitzungsobjekten:
Der folgende Code lässt eine Sitzung offen:
try { Session session = repository.loginAdministrative(null); Knoten node = session.getNode("/content/we-retail"); log.info("Knoten: " + node.getPath()); } catch (RepositoryException re)
Hinweis: Dieser Code schließt nicht nur die Sitzung, sondern ruft auch repository.loginAdministrative auf, um sie zu öffnen. Diese Art der Eröffnung von Sitzungen wird aus Sicherheitsgründen in späteren Versionen von AEM nicht mehr unterstützt.
Um die Sitzung zu schließen, schließen Sie den Code mit einem try/finally -Block und rufen session.logout() auf:
Sitzungssitzung = null; try { session = repository.loginAdministrative(null); // Verwenden Sie session } catch (RepositoryException re) { log.error(re.getMessage(), re); } finally { if (session != null && session.isLive()) { session.logout(); } } }
Seien Sie vorsichtig, wenn Sie eine Sitzung erstellen oder eine freigeben. Wenn Sie eine Sitzung über Objekte hinweg freigeben, wird es schwieriger zu verfolgen, wo sie geöffnet wurde und wann sie geschlossen werden muss. Außerdem sollten Sitzungen niemals über Java Threads hinweg freigegeben werden.
Schließen von ResourceResolver-Objekten:
Im folgenden Code wird ein ResourceResolver geöffnet:
try{ ResourceResolver resourceResolver = resourceFactory.getServiceResourceResolver(paramMap); Resource resource = resourceResolver.getResource("/content/we-retail"); log.info("Resource: " + res.getPath()); } catch(Exception e)
Um den resourceResolver zu schließen, schließen Sie den Code mit einem try/finally -Block und rufen Sie resourceResolver.close() auf:
try{ ResourceResolver resourceResolver = resourceFactory.getServiceResourceResolver(paramMap); // Verwenden Sie ResourceResolver } catch (Exception e) { log.error(e.getMessage()); } finally { if(resourceResolver != null && resourceResolver.isLive()) { resourceResolver.close(); } } }
Wichtiger Hinweis
Session- und ResourceResolver-Objekte, die über SlingRequest oder WorkflowSession abgerufen werden, sollten nicht von Ihrer Anwendung geschlossen werden. Beispiel:
slingRequest.getResourceResolver().adaptTo(Session.class); //Or workflowSession.getSession();
Dieser Resolver und diese Sitzung werden automatisch geschlossen, nachdem die Anfrage verarbeitet wurde.