Compruebe si su aplicación AEM 6.x tiene una fuga de sesión de JCR y localice la fuente.

Entorno

AEM 6.x

Pasos

I. Compruebe si hay una fuga de sesión

  1. Vaya a http://host:port/system/console/jmx e inicie sesión como administrador.
  2. Utilice la función de búsqueda del navegador para encontrar todas las ocurrencias de los objetos SessionStatistics en la página.
  3. Si encuentra más de 500, entonces hay una fuga de sesión.

II. Identificar el código que está filtrando las sesiones

Si encuentra una fuga de sesión, siga los pasos que se indican a continuación para averiguar qué la está causando.

  1. Desplácese hacia abajo por la página hasta los objetos SessionStatistics.
  2. Abra algunos de los objetos de SessionStatistics en una nueva pestaña del navegador mediante [Ctrl]+Clic en algunos de los objetos que tengan una marca de tiempo posterior o un número de identificación superior en la lista.  Por ejemplo, el de abajo tiene un id de 12105:org.apache.jackrabbit.oak "SessionStatistics" "admin@session-12105@Aug 10, 2016 7:03:25 PM" {id=287}. Cuanto mayor sea el número de identificación, más tarde se creará la sesión tras el último reinicio de AEM.
  3. Revise las trazas de pilas para ver qué código abrió esas sesiones.
  4. Busque paquetes java de aplicación en el conjunto.  Si el código es parte de su aplicación, consulte la siguiente sección.

III. Corrección de la fuga de la sesión

Para prevenir y corregir fugas en las sesiones de JCR:

  • Si abre una sesión javax.jcr.session en su código, ciérrela siempre a través de Session.logout().
  • Si usted abre org.apache.api.api.resource.ResourceResolver en su código, entonces ciérrela siempre a través de ResourceResolver.close()

Objetos de la sesión de cierre:

El siguiente código deja una sesión abierta:

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:

Además de cerrar la sesión, este código también llama a repository.loginAdministrative para abrirla. Esta forma de apertura de sesiones ha sido obsoleta en versiones posteriores de AEM por razones de seguridad.

Para cerrar la sesión, envuelva el código con un bloqueo de intento/final y llama a 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();
}
}

Tenga cuidado cuando cree una sesión o la comparta.  Cuando se comparte una sesión a través de objetos, entonces es más difícil rastrear dónde se abrió y cuándo tiene que cerrarse.  Además, las sesiones nunca deben ser compartidas a través de subprocesos de Java.

Cerrar objetos ResourceResolver:

El siguiente código deja un ResourceResolver abierto:

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

Para cerrar el resourceResolver, envuelva el código con un intento/bloqueo final y llame 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

Los objetos Session y ResourceResolver que se obtienen a través de SlingRequest o WorkflowSession no deben ser cerrados por su aplicación.  Por ejemplo:

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

El solucionador y la sesión se cerrarán automáticamente después de que se haya procesado la solicitud.

Esta obra está autorizada con arreglo a la licencia de Reconocimiento-NoComercial-CompartirIgual 3.0 Unported de Creative Commons.  Los términos de Creative Commons no cubren las publicaciones en Twitter™ y Facebook.

Avisos legales   |   Política de privacidad en línea