Session 在AEM中关闭资源解析程序对象后,会话已关闭

Session 在AEM中关闭资源解析程序对象后,会话已关闭,session,resources,aem,sling,jcr,Session,Resources,Aem,Sling,Jcr,我正试图关闭我打开的资源解析程序,但出现了以下错误“javax.jcr.RepositoryException:当我关闭资源解析程序时,此会话已关闭。实际上,如果您将资源解析程序保持为打开状态,我看不到任何问题,但我不想在代码中保持资源解析程序打开 serviceParam.put(ResourceResolverFactory.SUBSERVICE, "serviceNew"); ResourceResolver resourceResolver = nul

我正试图关闭我打开的资源解析程序,但出现了以下错误“javax.jcr.RepositoryException:当我关闭资源解析程序时,此会话已关闭。实际上,如果您将资源解析程序保持为打开状态,我看不到任何问题,但我不想在代码中保持资源解析程序打开

serviceParam.put(ResourceResolverFactory.SUBSERVICE, "serviceNew");
        ResourceResolver resourceResolver = null;

        try
        {

            resourceResolver = resourceResolverFactory.getServiceResourceResolver(serviceParam);

            final Configuration configuration = configurationManagerFactory.getConfigurationManager(resourceResolver)
                    .getConfiguration(cloudConfigurationType.getServiceName(), services);

            if (null != configuration)
            {
               return configuration.getContentResource().adaptTo(ValueMap.class);
            }

        } catch (LoginException e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } finally
        {
            if (resourceResolver != null && resourceResolver.isLive())
            {
                resourceResolver.close();
            }
        }
错误消息:-

org.apache.sling.engine.impl.SlingRequestProcessorImpl service: Uncaught SlingException
java.lang.IllegalArgumentException: javax.jcr.RepositoryException: This session has been closed.
    at org.apache.sling.jcr.resource.internal.JcrValueMap.read(JcrValueMap.java:337) [org.apache.sling.jcr.resource:3.0.16]
    at org.apache.sling.jcr.resource.internal.JcrValueMap.get(JcrValueMap.java:101) [org.apache.sling.jcr.resource:3.0.16]
如果我不在代码中关闭资源解析程序,就会在日志中观察到许多错误消息,如下所示

 23.12.2020 11:56:30.481 [Apache Sling Resource Resolver Finalizer Thread] INFO o.a.s.r.i.CommonResourceResolverFactoryImpl Unclosed ResourceResolver was created here:
    java.lang.Exception: Opening Stacktrace
    at org.apache.sling.resourceresolver.impl.CommonResourceResolverFactoryImpl$ResolverReference.<init>(CommonResourceResolverFactoryImpl.java:540)
23.12.2020 11:56:30.481[Apache Sling资源解析程序终结器线程]信息o.a.s.r.i.CommonResourceResolverFactoryImpl未关闭的资源解析程序在此处创建:
java.lang.Exception:打开Stacktrace
位于org.apache.sling.resourceresolver.impl.CommonResourceResolverFactoryImpl$ResolverReference。(CommonResourceResolverFactoryImpl.java:540)

真正的问题是,一旦我们关闭资源解析程序,会话就会被关闭。这是AEM代码的问题吗?还是处理这种情况的任何其他方法的问题?

好吧,基本上问题在于代码。根据定义关闭资源解析程序也会关闭它所基于的会话。 诀窍是在不再需要所有依赖对象(例如ValueMap)后关闭它


HTH.

问题是返回的ValueMap对象试图使用内部创建的ResourceResolver动态访问存储库,但该解析器在退出方法时已立即关闭(在finally块中)

有不同的解决方案可以克服这一问题,效率更高/更低:

解决方案1) 当您只需要以只读方式访问ValueMap属性时,可以返回该映射的副本:

  ...
  ValueMap props = configuration.getContentResource().adaptTo(ValueMap.class)
  return (props != null) ? new HashMap<>(props)     // create the copy Map of props
                         : new HashMap<String, Object>(0);
解决方案4) 在上面的某个方法中创建service ResourceResolver,并将其传递到不需要ValueMap的地方:

    ...
    try(ResourceResolver resolver =  resourceResolverFactory.getServiceResourceResolver(serviceParam)) {
      ...
      ValueMap confProps = getConfigProps(resolver, ...);  // call your method
      //  use confProps as you wish safely
      ...
    }  // at this place, Resolver is closed and you cannot use confProps any more
  }
    ...
方案5)(方案4的极端变体) 在类/包启动时创建一次服务ResourceResolver,让它一直存在到应用程序关闭,并将其传递给方法。 尽管如此,吊索文件并不完全推荐这种变体

我可以根据需要提供更多的样品

    ...
    try(ResourceResolver resolver =  resourceResolverFactory.getServiceResourceResolver(serviceParam)) {
      ...
      ValueMap confProps = getConfigProps(resolver, ...);  // call your method
      //  use confProps as you wish safely
      ...
    }  // at this place, Resolver is closed and you cannot use confProps any more
  }
    ...