Controleren en analyseren of JCR-sessielekken in uw AEM voorkomen

Controleer of en bepaal de oorzaak van het lek in de JCR-sessie van de AEM 6.x-toepassing.

Beschrijving description

Controleer of uw AEM 6.x-toepassing een JCR-sessilek heeft en volg de bron op.

Milieu

AEM 6,4,6,5

Resolutie resolution

I. CONTROLEREN OF ER EEN VERGADERING IS

  1. Ga naar http://host:port/system/console/jmx en login als admin.
  2. Gebruik de browser onderzoekseigenschap om alle voorkomen van voorwerpen SessionStatistics op de pagina te vinden.
  3. Als u meer dan 500 mensen aantreft, is er een sessilek.

II. DE CODE AANDUIDEN DIE DE SESSIES ONTBREEKT

Als u een sessiellek hebt gevonden, volgt u de onderstaande stappen om te zien wat de oorzaak is.

  1. Schuif de pagina omlaag naar de SessionStatistics-objecten.
  2. Open enkele voorwerpen SessionStatistics in een nieuw browser lusje door [CTRL ] +klikkend wat die een recentere timestamp of hoger vermeld identiteitskaart aantal hebben.  Hieronder ziet u bijvoorbeeld een id van
  3. 12105:org.apache.jackrabbit.oak "SessionStatistics" "admin@session-12105@Aug 10, 2020 7:03:25 PM" {id=287}.
  4. Hoe hoger het id-nummer, hoe later de sessie is gemaakt na de laatste AEM.
  5. Bekijk de stacksporen die tonen welke code die zittingen opende.
  6. Zoek naar toepassingspakketten java in de stapel.  Als de code deel uitmaakt van uw toepassing, raadpleegt u de volgende sectie hieronder.

III. DE SESSIEVERLAAG CORRIGEREN

U voorkomt lekken bij JCR-sessies en corrigeert deze:

  • Als u a javax.jcr.Session in uw code opent dan sluit altijd het via Session.logout ()
  • Als u a org.apache.sling.api.resource.ResourceResolver in uw code opent dan sluit altijd het via ResourceResolver.close ()

Sluiten de voorwerpen van de Zitting:

De onderstaande code laat een sessie open:

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

*Opmerking:*Naast het sluiten van de sessie, roept deze code ook repository.loginAdministrative aan om het te openen. Deze manier van het openen van zittingen is verouderd in recentere versies van AEM om veiligheidsredenen.

Als u de sessie wilt sluiten, plaatst u de code tussen try/finally en call 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();
}
}

Wees voorzichtig wanneer u een sessie maakt of deelt.  Wanneer u een sessie deelt over objecten, wordt het moeilijker om te volgen waar de sessie is geopend en wanneer deze moet worden gesloten.  Bovendien mogen sessies niet worden gedeeld in Java Threads.

het sluiten voorwerpen ResourceResolver:

De onderstaande code laat een ResourceResolver open:

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

Als u de resourceResolver wilt sluiten, plaatst u de code in een blok try/finally en roept u resourceResolver.close() aan:

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

Belangrijke Nota

De voorwerpen van de zitting en ResourceResolver die via SlingRequest of WorkflowSession worden verkregen zouden niet door uw toepassing moeten worden gesloten.  Bijvoorbeeld:

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

Deze oplosser en sessie worden automatisch gesloten nadat het verzoek is verwerkt.

recommendation-more-help
3d58f420-19b5-47a0-a122-5c9dab55ec7f