Verifica e identifica la causa della perdita di sessione JCR per l’applicazione AEM 6.x.
Controlla se l’applicazione AEM 6.x presenta una perdita di sessione JCR e rintraccia la sorgente.
Ambiente
AEM 6.4, 6.5
I. CONTROLLARE SE SI È VERIFICATA 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.
[
Ctrl]
+Fare clic su alcuni che hanno un timestamp successivo o un numero id superiore elencato. Ad esempio, quello seguente ha un ID di12105:org.apache.jackrabbit.oak "SessionStatistics" "admin@session-12105@Aug 10, 2020 7:03:25 PM" {id=287}
.III. CORREGGERE LA PERDITA DI DATI NELLA SESSIONE
Per prevenire e correggere le perdite della sessione JCR:
Chiusura degli oggetti Session:
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.