Controlla e analizza se la sessione di JCR perde nell'istanza di AEM

Descrizione

Controlla se la tua applicazione AEM6.x ha una perdita di sessione JCR e tiene traccia della sorgente

Ambiente

AEM 6.4, 6.5

Risoluzione

Passaggi

I. CONTROLLA SE C'È UNA PERDITA DI SESSIONE

  1. Vai su http://host:port/system/console/jmx and accedi come amministratore.

  2. Utilizza 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 di sessione.

II. IDENTIFICARE IL CODICE CHE STA PERDENDO LE SESSIONI

Se hai trovato una perdita di sessione, segui i passaggi seguenti per scoprire cosa la causa.

  1. Scorri verso il basso la pagina fino agli oggetti SessionStatistics.

  2. Apri alcuni degli oggetti SessionStatistics in una nuova scheda del browser [Ctrl]+Clic su alcuni che hanno elencato una marca temporale successiva o un numero id superiore.  Ad esempio, quello sottostante ha un ID di

12105:org.apache.jackrabbit.oak "SessionStatistics" "admin@session-12105@Aug 10, 2020 7:03:25 PM" {id=287}. Più alto è il numero id, più tardi la sessione è stata creata dopo l'ultimo riavvio AEM.

  1. Esamina le tracce della pila che mostrano quale codice ha aperto quelle sessioni.

  2. Cerca i pacchetti java dell'applicazione nello stack.  Se il codice fa parte dell'applicazione, consulta la sezione successiva qui sotto.

III. CORREGGERE LA PERDITA DELLA SESSIONE

Per prevenire e correggere le perdite di sessione di JCR:

  • Se apri una javax.jcr.Session nel codice, quindi chiudi sempre tramite Session.logout()

  • Se apri una org.apache.sling.api.resource.ResourceResolver nel codice, quindi chiudi sempre tramite ResourceResolver.close()

Oggetti della sessione di chiusura:

Il codice seguente lascia aperta una sessione:

prova { Sessione sessione = repository.loginAdministrative(null); Node node = session.getNode("/content/we-retail");   log.info("Nodo: " + node.getPath()); } catch (RepositoryException 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 di AEM per motivi di sicurezza.

Per chiudere la sessione, il codice viene racchiuso con un blocco try/finally e una chiamata session.logout():

Sessione = null; prova { session = repository.loginAdministrative(null); // usa sessione } catch (RepositoryException re) { log.error(re.getMessage(), re); } finally { if (session != null && session.isLive())

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 tra i thread Java.

Chiusura degli oggetti ResourceResolver:

Il codice seguente lascia aperto un ResourceResolver:

try{ ResourceResolver resourceResolver = resourceFactory.getServiceResourceResolver(paramMap);   Risorsa risorsa = resourceResolver.getResource("/content/we-retail");   log.info("Risorsa: " + res.getPath()); } catch(Exception e)

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

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

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); //O workflowSession.getSession();

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

In questa pagina