問題点

AEM error.log ログメッセージでは、セッションが検出されました。例えば、[1] の下の例でこのコードのセッションでのリークを確認できます。

com.day.cq.dam.scene7.impl.listener.Scene7AssetActivationListener.searchViewerWidgets(Scene7AssetActivationListener.java:306)

この場合、セッションリークが管理者 ResourceResolver の作成から発生します。

org.apache.sling.resourceresolver.impl.ResourceResolverFactoryImpl.getAdministrativeResourceResolver(ResourceResolverFactoryImpl.java:107)

ただし、管理セッション、サービスリゾルバ、またはサービスセッションを開くと、同じことが起こります。

[1] セッションのリーク例

WARN [Finalizer] org.apache.jackrabbit.core.SessionImpl Unclosed session detected. The session was opened here: java.lang.Exception: Stack Trace
at org.apache.jackrabbit.core.SessionImpl.<init>(SessionImpl.java:222)
at org.apache.jackrabbit.core.XASessionImpl.<init>(XASessionImpl.java:117)
at com.day.crx.core.CRXSessionImpl.<init>(CRXSessionImpl.java:69)
at com.day.crx.core.CRXRepositoryImpl.createSessionInstance(CRXRepositoryImpl.java:935)
at org.apache.jackrabbit.core.RepositoryImpl.createSession(RepositoryImpl.java:959)
at org.apache.jackrabbit.core.SessionFactory.createAdminSession(SessionFactory.java:42)
at com.day.crx.sling.server.impl.SlingRepositoryWrapper.loginAdministrative(SlingRepositoryWrapper.java:76)
at org.apache.sling.jcr.resource.internal.helper.jcr.JcrResourceProviderFactory.getResourceProviderInternal(JcrResourceProviderFactory.java:136)
at org.apache.sling.jcr.resource.internal.helper.jcr.JcrResourceProviderFactory.getAdministrativeResourceProvider(JcrResourceProviderFactory.java:115)
at org.apache.sling.resourceresolver.impl.tree.ResourceProviderFactoryHandler.login(ResourceProviderFactoryHandler.java:162)
at org.apache.sling.resourceresolver.impl.tree.RootResourceProviderEntry.loginToRequiredFactories(RootResourceProviderEntry.java:95)
at org.apache.sling.resourceresolver.impl.ResourceResolverFactoryImpl.getResourceResolverInternal(ResourceResolverFactoryImpl.java:98)
at org.apache.sling.resourceresolver.impl.ResourceResolverFactoryImpl.getAdministrativeResourceResolver(ResourceResolverFactoryImpl.java:72)
at org.apache.sling.resourceresolver.impl.helper.ResourceResolverContext.getResourceTypeResourceResolver(ResourceResolverContext.java:192)
at org.apache.sling.resourceresolver.impl.helper.ResourceResolverContext.getParentResourceType(ResourceResolverContext.java:216)
at org.apache.sling.resourceresolver.impl.ResourceResolverImpl.getParentResourceType(ResourceResolverImpl.java:1136)
at org.apache.sling.resourceresolver.impl.ResourceResolverImpl.getParentResourceType(ResourceResolverImpl.java:1126)
at org.apache.sling.resourceresolver.impl.ResourceResolverImpl.isResourceType(ResourceResolverImpl.java:1151)
at org.apache.sling.api.resource.AbstractResource.isResourceType(AbstractResource.java:115)
at com.day.cq.dam.scene7.impl.listener.Scene7AssetActivationListener.searchViewerWidgets(Scene7AssetActivationListener.java:306)

解決策

セッションを作成するコードが AEM、Sling または Oak 製品コードの場合は、AEM カスタマーケアに音言わせください。

カスタムコードの場合は、セッションをログアウトするか、ResourceResolver を終了したときに ResourceResolver を閉じます。

開いて閉じているセッションの例:

Session session = null;
try {
  session = repository.getService("readService",null);
  // use session
} finally {
  if(session != null && session.isLive()) {
    session.logout();
  }
}

開いて閉じている ResourceResolver の例:

ResourceResolver resolver = null;
try {
  resolver = resourceFactory.getServiceResourceResolver(paramMap); 
  // use resolver
} finally {
  if(resolver != null && resolver.isLive()){
    resolver.close();
  }
}

本作品は Creative Commons Attribution-Noncommercial-Share Alike 3.0 Unported License によってライセンス許可を受けています。  Twitter™ および Facebook の投稿には、Creative Commons の規約内容は適用されません。

法律上の注意   |   プライバシーポリシー