我们是否需要关闭资源解析器和会话?

时间:2017-08-16 14:28:38

标签: cq5 aem aem-6

我从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 个答案:

答案 0 :(得分:9)

当您调用ResourceResolver方法时,Session会关闭基础ResourceResolver.close()

如果您使用较新版本的Sling,我会建议您在使用try-with-resource时使用ResourceResolver构造:

try (final ResourceResolver resolver = this.getResourceResolver()) {
    [... use resolver here ...]
}

由于ResourceResolver实现了AutoClosable接口,因此它可以与try-with-resource一起使用。这将始终关闭ResourceResolver,您不必处理异常等。

请注意,您只能使用自己创建的ResourceResolver执行此操作。如果您使用从ResourceResolver获得的Resource,则不应将其关闭。最佳做法是,只有创建ResourceResolver的人才能关闭它。

答案 1 :(得分:2)

关闭一个将关闭它们。如果您记录消息或调试,您将看到您没有输入第二个if语句。