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