我正在使用Sling ResourceResolver在我的AEM代码中使用两种方式。
使用ResourceResolverFactory获取它。
@Reference
ResourceResolverFactory工厂;
ResourceResolver resolver = factory.getResourceResolver();
我在finally块中使用此ResourceResolver。
finally{
resolver.close();}
使用SlingHttpServletRequest获取它
ResourceResolver resolver = request.getResourceResolver();
我的问题是我是否需要关闭从SlingHttpServletRequest获取的ResourceResolver,或者当请求终止时,它的ResourceResolver也将被关闭?
答案 0 :(得分:11)
我们从SlingHttpServletRequest获取的ResourceResolver由容器管理,我们不应该关闭它。根据{{3}}
资源解析器的生命周期从创建开始 资源解析器使用任何工厂方法并以 调用close()方法。调用close()非常重要 方法一旦资源解析器不再使用,以确保任何 系统资源得到妥善清理。
因此我们从工厂获得的ResourceResolver应该由我们自己的代码管理。另请查看official documentation这可以很好地了解ResourceResolver和Sessions,这些内容对于Sling和JCR的预期非常重要
答案 1 :(得分:2)
正如所指出的,您不希望关闭您未创建的ResourceResolver。或者更具体一点:您永远不应该关闭您无法处理的会话 或 livecycle 的ResourceResolver。例如,如果您适应ResourceResolver,则不能关闭它,因为底层会话也将关闭。会话处理是完全透明的,因此您需要信任服务供应商,确保实现正确。
答案 2 :(得分:0)
例如,当您使用吊索请求提供的资源解析程序并在代码中手动关闭时,代码中稍后触发的其他服务将无法再使用它。这意味着你会得到很多异常,告诉你资源解析器已经关闭。
当请求是" over"时,请求提供的资源解析器将自动关闭。
答案 3 :(得分:0)
我仍然不完全清楚资源解析器的所有权在哪里,但是在编写访问JCR树的组件时已经玩了一些,很明显关闭组件中的资源解析器会导致问题。即使我只访问资源解析器打开的组件代码中的JCR树,页面处理的其他部分也需要ResourceResolver保持打开状态,因此我只是出现页面错误。
从逻辑上考虑这个问题,假设一个页面可能包含多个组件,其中任何组件都可能需要访问JCR树,一个组件关闭线程ResourceResolver绝对不正确,因为这会影响正在呈现的其他组件在同一个请求中。文档和讨论对此并不是特别清楚,但我的理解是,当组件从适应的SlingHttpServletRequest获取线程ResourceResolver时,ResourceResolver由处理整个页面(或其他框架代码)的SlingServlet拥有和管理。
似乎有可能在编写Sling servlet时应关闭ResourceResolver,但即使这样,也可以从注入的工厂或请求中获取线程ResourceResolver,因此我怀疑它仍然由框架代码拥有,并且框架将在所有处理完成后关闭它,或者工厂可能维护一个打开的资源解析器池,这些解析器刚刚分配给请求处理线程,然后返回池而不关闭。我需要掌握AEM来源以进行检查。
我已经看到了关闭资源解析器的工作吊索servlet的示例,但是这些示例似乎使用了弃用的getAdministrativeResourceResolver方法而不是getThreadResourceResolver,因此这可以解释差异。