Controlla e analizza se la sessione JCR presenta perdite nell’istanza AEM

Verifica e identifica la causa della perdita di sessione JCR per l’applicazione AEM 6.x.

Descrizione description

Controlla se l’applicazione AEM 6.x presenta una perdita di sessione JCR e rintraccia la sorgente.

Ambiente

AEM 6.4, 6.5

Risoluzione resolution

I. CONTROLLARE SE SI È VERIFICATA UNA PERDITA DI SESSIONE

  1. Vai a http://host:port/system/console/jmx e accedi come amministratore.
  2. Utilizzare la funzione di ricerca del browser per trovare tutte le occorrenze degli oggetti SessionStatistics nella pagina.
  3. Se ne trovate più di 500, allora c'è una perdita di sessione.

II. IDENTIFICARE IL CODICE DELLE SESSIONI CON PERDITA DI DATI

Se hai riscontrato una perdita di sessione, segui i passaggi seguenti per individuare la causa.

  1. Scorrere la pagina fino agli oggetti SessionStatistics.
  2. Apri alcuni degli oggetti SessionStatistics in una nuova scheda del browser con [Ctrl] +Fare clic su alcuni che hanno un timestamp successivo o un numero id superiore.  Ad esempio, quello seguente ha un ID di
  3. 12105:org.apache.jackrabbit.oak "SessionStatistics" "admin@session-12105@Aug 10, 2020 7:03:25 PM" {id=287}.
  4. Maggiore è il numero di ID, più tardi verrà creata la sessione dopo l’ultimo riavvio dell’AEM.
  5. Esamina le tracce dello stack che mostrano il codice che ha aperto le sessioni.
  6. Cerca pacchetti Java dell'applicazione nello stack.  Se il codice fa parte dell'applicazione, consulta la sezione successiva di seguito.

III. CORREGGERE LA PERDITA DI DATI NELLA SESSIONE

Per prevenire e correggere le perdite della sessione JCR:

  • Se apri una javax.jcr.Session nel codice, chiudila sempre tramite Session.logout()
  • Se apri un org.apache.sling.api.resource.ResourceResolver nel codice, chiudilo sempre tramite ResourceResolver.close()

Chiusura degli oggetti sessione:

Il codice seguente lascia aperta una sessione:

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);
}

*Nota:*Oltre a chiudere la sessione, questo codice chiama anche repository.loginAdministrative per aprirla. Questo modo di aprire le sessioni è stato dichiarato obsoleto nelle versioni successive dell’AEM per motivi di sicurezza.

Per chiudere la sessione, devi eseguire il wrapping del codice con un blocco try/finally e chiamare session.logout():

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();
}
}

Presta attenzione quando crei una sessione o ne condividi una.  Quando condividi una sessione tra oggetti, diventa più difficile tenere traccia di dove è stata aperta e quando deve essere chiusa.  Inoltre, le sessioni non devono mai essere condivise in Java Threads.

Chiusura degli oggetti ResourceResolver:

Il codice seguente lascia aperto un ResourceResolver:

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());
}

Per chiudere resourceResolver, racchiudi il codice con un blocco try/finally e chiama resourceResolver.close():

try{
ResourceResolver resourceResolver = resourceFactory.getServiceResourceResolver(paramMap);
  // use ResourceResolver
} catch (Exception e) {
log.error(e.getMessage());
} finally {
if(resourceResolver != null && resourceResolver.isLive()) {
resourceResolver.close();
  }
}

Nota importante

Gli oggetti Session e ResourceResolver ottenuti tramite SlingRequest o WorkflowSession non devono essere chiusi dall'applicazione.  Ad esempio:

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

Il resolver e la sessione verranno chiusi automaticamente dopo l’elaborazione della richiesta.

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