Controlla se la tua applicazione AEM6.x ha una perdita di sessione JCR e rintraccia l'origine.

Ambiente

AEM 6.x

Passaggi

I. Controlla se c'è una perdita di sessione

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

II. Identifica il codice che perde le sessioni

Se hai trovato una perdita della sessione, segui la procedura seguente per trovare la causa della perdita.

  1. Scorri la pagina fino agli oggetti SessionStatistics.
  2. Apri alcuni degli oggetti di SessionStatistics in una nuova scheda del browser con [Ctrl]+fai clic su alcuni che hanno un timestamp successivo o un numero id superiore.  Per esempio, quello che segue ha un id di 12105:org.apache.jackrabbit.oak "SessionStatistics" "admin@session-12105@Aug 10, 2016 7:03:25 PM" {id=287}. Più alto è il numero id, più tardi la sessione è stata creata dopo l'ultimo riavvio dell'AEM.
  3. Controlla le tracce della pila, mostrando quale codice ha aperto tali sessioni.
  4. Ricerca di pacchetti Java applicativi nella pila.  Se il codice fa parte della tua applicazione, vedi la sezione successiva qui sotto.

iii. Risolvi la perdita di sessione

Per prevenire e correggere le perdite di sessione di JCR:

  • Se aprite una sessione javax.jcr.jcr.Session nel vostro codice, allora chiudetela sempre tramite Session.logout()
  • Se aprite un org.apache.sling.api.api.resource.ResourceResolver nel vostro codice, allora chiudetelo sempre tramite ResourceResolver.close()

Oggetti della sessione di chiusura

Il codice sottostante lascia aperta una sessione:

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

Nota:

Oltre a chiudere la sessione, questo codice chiama anche repository.loginAdministrative per aprirla. Questa modalità di apertura delle sessioni è stata deprecata nelle versioni successive di AEM per motivi di sicurezza.

Per chiudere la sessione si dovrebbe avvolgere il codice con un try/finally block 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();
}
}

Fai attenzione quando crei una sessione o ne condividi una.  Quando condividi una sessione tra oggetti, allora è più difficile tracciare dove è stata aperta e quando deve essere chiusa.  Inoltre, le sessioni non dovrebbero mai essere condivise attraverso Java Threads.

Chiusura degli oggetti ResourceResolver:

Il codice sottostante lascia aperto un ResourceResolver:

try{
ResourceResolver resourceResolver = resourceFactory.getServiceResourceResolver(paramMap);
  Resource resource = resourceResolver.getResource("/content/geometrixx");
  log.info("Resource: " + res.getPath());
} catch(Exception e){
log.error(e.getMessage());
}

Per chiudere il resourceResolver, avvolgi il codice con un blocco di prova/finalmente e chiamare 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.  Esempio:

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

Il resolver e la sessione saranno chiusi automaticamente dopo che la richiesta è stata elaborata.

Questo prodotto è concesso in licenza in base alla licenza di Attribuzione-Non commerciale-Condividi allo stesso modo 3.0 Unported di Creative Commons.  I post su Twitter™ e Facebook non sono coperti dai termini di Creative Commons.

Note legali   |   Informativa sulla privacy online