Verifique se o seu aplicativo AEM6.x possui um vazamento de sessão do JCR e rastreie a origem.

Ambiente

AEM 6.x

Etapas

I. Verifique se há um vazamento de sessão

  1. Acesse http://host:port/system/console/jmx e faça o logon como admin.
  2. Use o recurso de pesquisa do navegador para localizar todas as ocorrências de objetos SessionStatistics na página.
  3. Se você encontrar mais de 500, há um vazamento de sessão.

II. Identifique o código que está vazando sessões.

Em caso de vazamento de sessão, siga as etapas abaixo para descobrir o que está causando isso.

  1. Role a página para baixo até os objetos SessionStatistics.
  2. Abra alguns dos objetos SessionStatistics em uma nova guia do navegador com [Ctrl]+Clique em alguns que têm um registro de data e hora posterior ou um número de ID mais alto listado.  Por exemplo, o objeto abaixo tem um ID 12105:org.apache.jackrabbit.oak "SessionStatistics" "admin @ session-12105@Aug 10, 2016 7:03:25 PM" {id=287}. Quanto maior o número de identificação, mais tarde a sessão foi criada após a última reinicialização do AEM.
  3. Revise os rastreamentos de pilha que mostram qual código abriu essas sessões.
  4. Procure por pacotes java de aplicativos na pilha.  Se o código fizer parte do seu aplicativo, consulte a próxima seção abaixo.

III. Corrigir o vazamento da sessão

Para evitar e corrigir vazamentos de sessão do JCR:

  • Se abrir javax.jcr.Session no seu código, sempre feche via Session.logout()
  • Se abrir um org.apache.sling.api.resource.ResourceResolver no seu código, sempre feche via ResourceResolver.close()

Fechamento de objetos da sessão:

O código abaixo deixa uma sessão em aberto:

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

Observação:

Além de não apenas fechar a sessão, esse código também chama repository.loginAdministrative para abri-la. Essa maneira de abrir sessões foi descontinuada em versões posteriores do AEM por motivos de segurança.

Para fechar a sessão, é necessário envolver o código com um bloco try/finally e chamar 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();
}
}

Tenha cuidado ao criar ou compartilhar uma sessão.  Quando uma sessão é compartilhada entre objetos, fica mais difícil rastrear onde ela foi aberta e quando ela deve ser fechada.  Além disso, as sessões nunca devem ser compartilhadas entre os threads Java.

Fechamento de objetos ResourceResolver:

O código abaixo deixa um ResourceResolver aberto:

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 fechar o resourceResolver, envolva o código com um bloco try/finally e chame 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

Objetos Session e ResourceResolver que são obtidos através do SlingRequest ou WorkflowSession não devem ser fechados pelo seu aplicativo.  Por exemplo:

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

Esse resolvedor e sessão serão fechados automaticamente após o processamento da solicitação.

Esta obra está licenciada sob uma licença não adaptada da Creative Commons Attribution-Noncommercial-Share Alike 3.0  As publicações do Twitter™ e do Facebook não são cobertas pelos termos do Creative Commons.

Avisos legais   |   Política de privacidade online