Überprüfen und analysieren Sie, ob JCR-Sitzung in Ihrer AEM-Instanz undicht ist.
Suchen Sie nach dem JCR-Sitzungsleck in der AEM 6.x-Anwendung und identifizieren Sie die Ursache dafür.
Beschreibung
Überprüfen Sie, ob in der AEM 6.x-Anwendung ein JCR-Sitzungsleck vorhanden ist, und verfolgen Sie die Quelle nach.
Umgebung
AEM 6.4,6.5
Lösung
I. ÜBERPRÜFEN, OB EIN SITZUNGSLECK VORLIEGT
- Navigieren Sie zu http://host:port/system/console/jmx und 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, gibt es ein Sitzungsleck.
II. IDENTIFIZIEREN SIE DEN CODE, DER SITZUNGEN VERLÄSST
Wenn Sie ein Sitzungsleck gefunden haben, gehen Sie wie folgt vor, um die Ursache zu finden.
- Scrollen Sie auf der Seite nach unten zu den SessionStatistics-Objekten.
- Öffnen Sie einige der SessionStatistics -Objekte in einer neuen Browser-Registerkarte, indem Sie Strg
]
+Klicken auf einige mit einem späteren Zeitstempel oder einer höheren ID-Nummer[
. Die folgende hat beispielsweise die ID . 12105:org.apache.jackrabbit.oak "SessionStatistics" "admin@session-12105@Aug 10, 2020 7:03:25 PM" {id=287}
.- Je höher die ID-Nummer ist, 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 Java-Programmpaketen. Wenn der Code Teil Ihres Programms ist, lesen Sie den nächsten Abschnitt unten.
III. SITZUNGSLECK KORRIGIEREN
So verhindern und beheben Sie JCR-Sitzungslecks:
- Wenn Sie eine javax.jcr.Session in Ihrem Code öffnen, schließen Sie sie immer über Session.logout()
- Wenn Sie ein org.apache.sling.api.resource.ResourceResolver in Ihrem Code öffnen, schließen Sie es immer über ResourceResolver.close()
Sitzungsobjekte werden geschlossen:
Der unten stehende Code lässt eine Sitzung offen:
try {
Session session = repository.loginAdministrative(null);
Node node = session.getNode("/content/we-retail");
log.info("Node: " + node.getPath());
} catch (RepositoryException re) {
log.error(re.getMessage(), re);
}
*Hinweis:*Dieser Code schließt nicht nur die Sitzung, sondern ruft auch repository.loginAdministrative auf, um sie zu öffnen. Diese Methode zum Öffnen von Sitzungen wird in späteren Versionen von AEM aus Sicherheitsgründen nicht mehr unterstützt.
Um die Sitzung zu schließen, schließen Sie den Code in einen try/finally-Block ein und rufen session.logout() auf:
Session session = null;
try {
session = repository.loginAdministrative(null);
// use 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 objektübergreifend teilen, ist 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:
Der unten stehende Code lässt einen ResourceResolver offen:
try{
ResourceResolver resourceResolver = resourceFactory.getServiceResourceResolver(paramMap);
Resource resource = resourceResolver.getResource("/content/we-retail");
log.info("Resource: " + res.getPath());
} catch(Exception e){
log.error(e.getMessage());
}
Um den resourceResolver zu schließen, schließen Sie den Code mit einem try/finally-Block ein und rufen Sie resourceResolver.close() auf:
try{
ResourceResolver resourceResolver = resourceFactory.getServiceResourceResolver(paramMap);
// use ResourceResolver
} catch (Exception e) {
log.error(e.getMessage());
} finally {
if(resourceResolver != null && resourceResolver.isLive()) {
resourceResolver.close();
}
}
Wichtiger Hinweis
Sitzungs- und ResourceResolver-Objekte, die über die SlingRequest-Klasse oder die WorkflowSession abgerufen werden, sollten von der Anwendung nicht geschlossen werden. Beispiel:
slingRequest.getResourceResolver().adaptTo(Session.class);
//Or
workflowSession.getSession();
Dieser Resolver und diese Sitzung werden automatisch geschlossen, nachdem die Anfrage verarbeitet wurde.