Überprüfen Sie, ob Ihre AEM 6.x-Anwendung ein JCR-Session-Leak hat und machen Sie die Quelle ausfindig.

Umgebung

AEM 6.x

Schritte

I. Prüfen Sie, ob ein Session-Leak vorliegt

  1. Gehen Sie auf http://host:port/system/console/jmx und melden Sie sich als Administrator an.
  2. Verwenden Sie die Suchfunktion des Browsers, um alle Vorkommen von SessionStatistics-Objekten auf der Seite zu finden.
  3. Wenn Sie mehr als 500 finden, besteht ein Session-Leak.

II. Identifizieren Sie den Code, der die Session-Leaks verursacht.

Wenn Sie ein Leak gefunden haben, führen Sie die folgenden Schritte aus, um die Ursache zu finden.

  1. Scrollen Sie durch die Seite bis zu den SessionStatistics-Objekten.
  2. Öffnen Sie einige der SessionStatistics-Objekte in einer neuen Browserregisterkarte durch [Strg]+Klicken mehrerer Objekte, die einen neueren Zeitstempel oder eine höhere ID haben.  Beispielsweise enthält das unten stehende Objekt eine ID von 12105:org.apache.jackrabbit.oak "SessionStatistics" "admin@session-12105@Aug 10, 2016 7:03:25 PM" {id=287}. Je höher die ID-Nummer, desto später wurde die Session nach dem letzten AEM-Neustart erstellt.
  3. Überprüfen Sie die Stack-Traces, die anzeigen, welcher Code diese Sessions geöffnet hat.
  4. Suchen Sie im Stack nach Java-Anwendungspaketen.  Wenn der Code Teil Ihrer Anwendung ist, finden Sie weitere Informationen im nächsten Abschnitt.

III. Korrigieren des Session-Leaks

Um JCR-Session-Leaks zu verhindern und zu reparieren:

  • Wenn Sie eine javax.jcr.Session-Session in Ihrem Code öffnen, schließen Sie sie immer mit Session.logout()
  • Wenn Sie eine org.apache.sling.api.resource.ResourceResolver-Session in Ihrem Code öffnen, schließen Sie sie immer mit ResourceResolver.close()

Schließen von Session-Objekten:

Bei folgendem Code wird eine Sitzung offen gelassen:

try {
Session session = repository.loginAdministrative(null);
Node node = session.getNode("/content/geometrixx");
  log.info("Node: " + node.getPath());
} catch (RepositoryException re) {
log.error(re.getMessage(), re);
}

Hinweis:

Neben dem Schließen der Session ruft dieser Code auch repository.loginAdministrative auf, um ihn zu öffnen. Das Öffnen von Sessions auf diese Weise wurde aus Sicherheitsgründen in späteren Versionen von AEM aufgegeben.

Um die Sitzung zu schließen, schließen Sie den Code mit einem try/finally-Block aus und rufen Sie 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 Session erstellen oder eine freigeben.  Wenn Sie eine Session über mehrere Objekte hinweg freigeben, ist es schwieriger, zu verfolgen, wo sie geöffnet wurde und wann sie geschlossen werden muss.  Außerdem sollten Sessions nie von mehreren Java-Threads gemeinsam genutzt werden.

Schließende ResourceResolver-Objekte:

Im folgenden Code wird ein ResourceResolver offen gelassen:

try{
ResourceResolver resourceResolver = resourceFactory.getServiceResourceResolver(paramMap);
  Resource resource = resourceResolver.getResource("/content/geometrixx");
  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 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

Session- und ResourceResolver-Objekte, die über SlingRequest oder WorkflowSession erhalten wurden, sollten nicht von Ihrer Anwendung geschlossen werden.  Beispiel:

slingRequest.getResourceResolver().adaptTo (Session.class);
//Oder
workflowSession.getSession();

Dieser Resolver und die Session werden automatisch geschlossen, nachdem die Anforderung verarbeitet wurde.

Dieses Werk unterliegt den Bedingungen der Creative Commons Attribution-Noncommercial-Share Alike 3.0 Unported License.  Twitter™- und Facebook-Beiträge fallen nicht unter die Bedingungen der Creative Commons-Lizenz.

Rechtliche Hinweise   |   Online-Datenschutzrichtlinie