Überprüfen und analysieren Sie, ob JCR-Sitzung in Ihrer AEM-Instanz leckt

Suchen und identifizieren Sie die Ursache Ihres JCR-Sitzungslecks in AEM 6.x-Anwendung.

Beschreibung description

Überprüfen Sie, ob Ihre AEM 6.x-Anwendung ein JCR-Sitzungsleck aufweist, und verfolgen Sie die Quelle nach unten.

Umgebung

AEM 6.4,6.5

Lösung resolution

I. ÜBERPRÜFEN, OB EIN SITZUNGSLÖSCHEN BESTEHT

  1. Navigieren Sie zu  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 ü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.

  1. Scrollen Sie auf der Seite nach unten zu den SessionStatistics-Objekten.
  2. Ö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
  3. 12105:org.apache.jackrabbit.oak "SessionStatistics" "admin@session-12105@Aug 10, 2020 7:03:25 PM" {id=287}.
  4. Je höher die ID-Nummer, desto später wurde die Sitzung nach dem letzten AEM Neustart erstellt.
  5. Überprüfen Sie die Stacktraces, die zeigen, welcher Code diese Sitzungen geöffnet hat.
  6. 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);
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 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:

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 ü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 in Java Threads 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){
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 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.

recommendation-more-help
3d58f420-19b5-47a0-a122-5c9dab55ec7f