AEM资源解析程序关闭?

AEM资源解析程序关闭?,aem,Aem,我在AEM代码中使用Sling ResourceResolver有两种方法 使用ResourceResolverFactory获取它 @参考文献 资源工厂; ResourceResolver解析器=factory.getResourceResolver 我在finally块中使用这个resourcesolver finally{ resolver.close();} 使用SlingHttpServletRequest获取它 ResourceResolver解析器=request.getReso

我在AEM代码中使用Sling ResourceResolver有两种方法

使用ResourceResolverFactory获取它

@参考文献 资源工厂; ResourceResolver解析器=factory.getResourceResolver

我在finally块中使用这个resourcesolver

finally{
resolver.close();}
使用SlingHttpServletRequest获取它

ResourceResolver解析器=request.getResourceResolver


我的问题是我是否需要关闭从SlingHttpServletRequest获得的ResourceResolver,或者当请求终止时,it ResourceResolver也将关闭?

我们从SlingHttpServletRequest获得的ResourceResolver由容器管理,我们不应该关闭它。按照

资源解析程序的生命周期从创建 资源解析程序使用任何工厂方法,并以 调用close方法。结束是非常重要的 方法,以确保不再使用资源解析程序 适当清理系统资源


因此,我们从工厂获得的ResourceResolver应该由我们自己的代码管理。另外,看看这一点,可以很好地了解资源解析程序和会话,这在Sling和JCR中很重要

我们从SlingHttpServletRequest获得的资源解析程序是由容器管理的,我们不应该关闭它。按照

资源解析程序的生命周期从创建 资源解析程序使用任何工厂方法,并以 调用close方法。结束是非常重要的 方法,以确保不再使用资源解析程序 适当清理系统资源


因此,我们从工厂获得的ResourceResolver应该由我们自己的代码管理。另外,还可以查看一下这篇文章,它提供了关于ResourceResolver和会话的良好见解,这在Sling和JCR prespective中非常重要。

正如所指出的,您不希望关闭您未创建的ResourceResolver。或者更具体地说:您不应该关闭ResourceResolver,因为您不处理该会话或livecycle。例如,如果您适应ResourceResolver,则不能将其关闭,因为基础会话也将关闭。会话处理是完全透明的,因此您需要相信服务供应商的实现是正确的。

如前所述,您不希望关闭未创建的ResourceResolver。或者更具体地说:您不应该关闭ResourceResolver,因为您不处理该会话或livecycle。例如,如果您适应ResourceResolver,则不能将其关闭,因为基础会话也将关闭。会话处理是完全透明的,因此您需要相信服务供应商的实现是正确的。

例如,当您使用sling请求提供的资源解析程序并在代码中手动关闭时,代码中稍后触发的其他服务将无法再使用它。这意味着您将收到很多异常,告诉您资源解析程序已经关闭


请求提供的资源解析程序将在请求结束时自动关闭。

例如,当您使用sling请求提供的资源解析程序并在代码中手动关闭该资源解析程序时,代码中稍后触发的其他服务将无法再使用它。这意味着您将收到很多异常,告诉您资源解析程序已经关闭


请求提供的资源冲突解决程序将在请求结束时自动关闭。

我仍然不完全清楚资源冲突解决程序的所有权在哪里,但在编写访问JCR树的组件的代码时,我做了一些尝试,很明显,关闭组件内的资源解析程序会导致问题。即使我只在资源解析程序打开的组件代码中访问JCR树,页面处理的其他部分也需要资源解析程序保持打开状态,因此我只会得到一个页面错误

从逻辑上考虑,考虑到一个页面可能包含多个组件,其中任何组件都可能需要访问JCR树,一个组件关闭thread ResourceResolver绝对是不正确的,因为这会影响在同一请求中呈现的其他组件。文档和讨论对此并不特别清楚,但我的理解是,当一个组件从一个经过调整的SlingHttpServletRequest获取线程资源解析程序时,资源解析程序由处理整个页面或其他框架代码的SlingServlet拥有和管理

这样看来,在编写Sling servlet时,ResourceResolver可能应该关闭,但即使这样,线程ResourceResolver也可以从注入工厂或请求中获得,因此我怀疑它仍然属于f 框架代码,框架将在所有处理完成后关闭它,或者工厂可能维护一个开放资源解析程序池,这些解析程序只分配给请求处理线程,然后返回到池中而不关闭。我需要联系AEM的来源进行检查


我见过关闭资源解析程序的工作sling servlet的示例,但这些示例似乎使用了不推荐使用的GetAdministrativeResourceSolver方法,而不是getThreadResourceResolver,因此,这可能解释了差异。

我仍然不完全清楚资源解析程序的所有权在哪里,但在编写访问JCR树的组件的代码时,很明显,关闭组件中的资源解析程序会导致问题。即使我只在资源解析程序打开的组件代码中访问JCR树,页面处理的其他部分也需要资源解析程序保持打开状态,因此我只会得到一个页面错误

从逻辑上考虑,考虑到一个页面可能包含多个组件,其中任何组件都可能需要访问JCR树,一个组件关闭thread ResourceResolver绝对是不正确的,因为这会影响在同一请求中呈现的其他组件。文档和讨论对此并不特别清楚,但我的理解是,当一个组件从一个经过调整的SlingHttpServletRequest获取线程资源解析程序时,资源解析程序由处理整个页面或其他框架代码的SlingServlet拥有和管理

在编写Sling servlet时,ResourceResolver可能会关闭,但即使这样,线程ResourceResolver也会从注入工厂或请求中获得,因此我怀疑它仍然属于框架代码,并且框架会在所有处理完成后关闭它,或者,工厂可能维护一个开放资源解析程序池,这些解析程序只分配给请求处理线程,然后返回到池中而不关闭。我需要联系AEM的来源进行检查


我见过关闭资源解析程序的工作sling servlet示例,但这些示例似乎使用了不推荐使用的getAdministrativeResourceResolver方法,而不是getThreadResourceResolver方法,因此这可以解释差异。

根据公认的答案,只有在打开资源解析程序后才应关闭它。关闭请求级资源解析程序将导致问题。当您在调用getAdministrativeResourceResolver方法时创建新引用以供使用时,不推荐使用的管理资源解析程序是不同的,因此您有责任关闭它。框架不会对线程打开的资源解析程序执行任何清理,也不会阻止代码关闭请求链打开的资源解析程序。我也有类似的问题,并在这里打开了请求-请在这里分享您的意见好吗?啊,谢谢@ezhil-不幸的是,我3年前换了团队,从那以后就再也没有接触过这些东西,所以尽管我的回答对我来说有点意义,但我完全不了解细节。我会看看你的问题,但我必须诚实,我真的不太可能有线索!另一方面,如果你有任何关于spring boot或Kafka的问题,那么也许我就是你的人:-啊,令人沮丧,因为我确信我已经看到了你提到的两条错误消息,但现在它太模糊了。真的很抱歉,希望有人能尽快给出正确的答案。谢谢你的回复克里斯。不用担心,我将根据已接受的答案浏览ITA,只有在打开资源解析后才应关闭它。关闭请求级资源解析程序将导致问题。当您在调用getAdministrativeResourceResolver方法时创建新引用以供使用时,不推荐使用的管理资源解析程序是不同的,因此您有责任关闭它。框架不会对线程打开的资源解析程序执行任何清理,也不会阻止代码关闭请求链打开的资源解析程序。我也有类似的问题,并在这里打开了请求-请在这里分享您的意见好吗?啊,谢谢@ezhil-不幸的是,我3年前换了团队,从那以后就再也没有接触过这些东西,所以尽管我的回答对我来说有点意义,但我完全不了解细节。我会看看你的问题,但我必须诚实,我真的不太可能有线索!另一方面,如果你有任何关于spring boot或Kafka的问题,那么也许我就是你的人:-啊,令人沮丧,因为我确信我已经看到了你提到的两条错误消息,但现在它太模糊了。真的很抱歉,希望有人能尽快给出正确的答案。谢谢你的回复 彭斯·克里斯。别担心,我会的