2017-08-16 156 views
1

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

这个问题是关于“我们应该关闭了两个”,而不是其关闭第一

+2

所有权规则适用。你打开它 - >你关闭它!通过[规则](https://cqdump.wordpress.com/2013/07/23/cq-development-patterns-sling-resourceresolver-and-jcr-sessions/)进行澄清 –

+0

可能的重复[应该关闭在关闭资源解析器之前的会话](https://stackoverflow.com/questions/37880336/should-i-close-the-session-before-closing-the-resource-resolver) –

回答

8

当您调用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的人才能关闭它。

2

关闭一个将关闭他们俩。如果您记录消息或进行调试,您将看到如果声明您没有输入。

+0

关闭resourceResolver也关闭会话,但如果只关闭会话,它不会以相同的方式工作,resourceResolver仍然可用,并且每当调用相同的resourceResolver时,将抛出异常“Session is closed”(AEM在某个池中缓存已打开的resourceResolver,因此可以请求resourceResolver时获取相同的resourceResolver) – rzasap

相关问题