我们是否需要关闭资源解析器和会话两者?
我从ResourceResolverFactory获取ResourceResolver对象,即创建此resourceResolver并且我正在适应Session。我们是否需要关闭资源解析器和会话两者?
Session session = resourceResolver.adaptTo(Session.class);
我需要关闭两个,解析器和会话或关闭一个就足够了吗?
finally {
if (session != null && session.isLive()) {
session.logout();
}
if (resourceResolver != null && resourceResolver.isLive()) {
resourceResolver.close();
}
}
这个问题是关于“我们应该关闭了两个”,而不是其关闭第一
当您调用ResourceResolver.close()
方法时,ResourceResolver
将关闭标的Session
。
如果使用吊带的较新版本我想提醒你,当你使用ResourceResolver
使用try-with-resource
结构:
try (final ResourceResolver resolver = this.getResourceResolver()) {
[... use resolver here ...]
}
由于ResourceResolver
实现AutoClosable
接口,它可以与try-with-resource
使用。这将始终关闭ResourceResolver
,您将不必处理例外情况等。
请注意,您只能使用您创建的ResourceResolver
进行此操作。例如,如果您使用从Resource
获得的ResourceResolver
,则不应将其关闭。最好的做法是只有创建ResourceResolver
的人才能关闭它。
关闭一个将关闭他们俩。如果您记录消息或进行调试,您将看到如果声明您没有输入。
关闭resourceResolver也关闭会话,但如果只关闭会话,它不会以相同的方式工作,resourceResolver仍然可用,并且每当调用相同的resourceResolver时,将抛出异常“Session is closed”(AEM在某个池中缓存已打开的resourceResolver,因此可以请求resourceResolver时获取相同的resourceResolver) – rzasap
所有权规则适用。你打开它 - >你关闭它!通过[规则](https://cqdump.wordpress.com/2013/07/23/cq-development-patterns-sling-resourceresolver-and-jcr-sessions/)进行澄清 –
可能的重复[应该关闭在关闭资源解析器之前的会话](https://stackoverflow.com/questions/37880336/should-i-close-the-session-before-closing-the-resource-resolver) –