<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic Re: AEM 6.4.8.3 Unclosed resourceResolver from custom ser... in Experience Manager Guides Questions</title>
    <link>https://experienceleaguecommunities.adobe.com/t5/experience-manager-guides/aem-6-4-8-3-unclosed-resourceresolver-from-custom-service-in/m-p/401121#M20</link>
    <description>&lt;P&gt;The linked post is specific to the QueryBuilder. This code does not use QueryBuilder and thus does not apply here. The code is a bit hard to read due to lack of formatting, but this is what this code should look like (making a few guesses):&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;LI-CODE lang="java"&gt;List&amp;lt;Map&amp;lt;String, Object&amp;gt; dataList = new ArrayList&amp;lt;&amp;gt;();
ResourceResolver resolver = null;
try {
    resolver = resourceResolverFactory.getServiceResourceResolver(Collections.singletonMap(ResourceResolverFactory.SUBSERVICE, ServiceUser.READ_ONLY_SERVICE.toString());
    final Session session = resolver.adaptTo(Session.class);
    final Query query = session.getWorkspace().getQueryManager().createQuery("/jcr:root" + nodePath + "/element(*,nt:base)[sling:resourceType='proj/components/page'] order by @" + PROPERTY_PUBDATE_NAME + " descending", Query.XPATH);
    query.setLimit(75);
    final QueryResult result = query.execute();
    if (result != null &amp;amp;&amp;amp; result.getNodes() != null) {
        final NodeIterator nodeIterator = result.getNodes();
        while (nodeIterator.hasNext()) {
            final Node node = nodeIterator.nextNode();
            if (node != null) {
                final Map&amp;lt;String, Object&amp;gt; nodePropertyMap = new HashMap&amp;lt;&amp;gt;();
                if (node.hasProperty(PROPERTY_JCR_TITLE)) {
                    nodePropertyMap.put(PROPERTY_JCR_TITLE, node.getProperty(PROPERTY_JCR_TITLE).getString());
                }
                if (node.hasProperty(PROPERTY_PUBDATE_NAME)) {
                    nodePropertyMap.put(PROPERTY_PUBDATE_NAME, node.getProperty(PROPERTY_PUBDATE_NAME).getDate());
                }
                nodePropertyMap.put("path", node.getPath());
                dataList.add(nodePropertyMap);
            }
        }
    }
} catch (final RepositoryException e) {
    logger.error(e.getMessage());
} finally {
    if (null != resolver) {
        resolver.close();
    }
}
return dataList;&lt;/LI-CODE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;It would, of course, be better to use&amp;nbsp;&lt;FONT face="courier new,courier"&gt;try-with-resources&lt;/FONT&gt;, but I didn't do that in this example because I wasn't sure that was available in 6.4.8, but per&amp;nbsp;&lt;LI-USER uid="1439549"&gt;&lt;/LI-USER&gt;&amp;nbsp;'s comment it is.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;When a &lt;FONT face="courier new,courier"&gt;ResourceResolver&lt;/FONT&gt; is left unclosed, the logged stack trace will point to exactly where the &lt;FONT face="courier new,courier"&gt;ResourceResolver&lt;/FONT&gt; was created (which you can actually see an example of in the linked post about the QueryBuilder).&amp;nbsp;&lt;/P&gt;</description>
    <pubDate>Thu, 25 Mar 2021 20:33:54 GMT</pubDate>
    <dc:creator>justin_at_adobe2</dc:creator>
    <dc:date>2021-03-25T20:33:54Z</dc:date>
    <item>
      <title>AEM 6.4.8.3 Unclosed resourceResolver from custom service in logs</title>
      <link>https://experienceleaguecommunities.adobe.com/t5/experience-manager-guides/aem-6-4-8-3-unclosed-resourceresolver-from-custom-service-in/m-p/401098#M19</link>
      <description>&lt;P&gt;We are closing the service RR in the finally block still we get the unclosed RR in logs for below method.&lt;BR /&gt;This&amp;nbsp;&lt;A href="https://helpx.adobe.com/au/experience-manager/kb/Unclosed-ResourceResolver-warnng-at-com-day-cq-search-impl-builder-QueryBuilderImpl.html" target="_blank" rel="noopener"&gt;post&lt;/A&gt;&amp;nbsp;has additional logic as a workaround to &lt;SPAN&gt;manually close the ResourceResolver after processing the query result.&amp;nbsp;&lt;BR /&gt;&lt;/SPAN&gt;Ques1) Do I need to do this extra workaround code for my method below.&lt;BR /&gt;&lt;BR /&gt;Please find method below with additional workaround, currently stuck with converting node to a resource.&amp;nbsp;&lt;BR /&gt;Ques2) Do we know how we can convert node to a resource&amp;nbsp;&lt;BR /&gt;&amp;nbsp;Resource closeableResource = adapterManager.getAdapter(closeableNode, Resource.class); // gives null resource&lt;BR /&gt;&lt;BR /&gt;Sample code from method below:&lt;BR /&gt;&lt;BR /&gt;import javax.jcr.query.Query; import javax.jcr.query.QueryResult;&lt;BR /&gt;&lt;BR /&gt;ResourceResolver resolver = null;&lt;BR /&gt;try { resolver = getResourceResolver(ServiceUser.READ_ONLY_SERVICE.toString());&lt;BR /&gt;final Session session = resolver.adaptTo(Session.class);&lt;BR /&gt;final Query query = session.getWorkspace().getQueryManager().createQuery("/jcr:root" + nodePath + "/element(*,nt:base)[sling:resourceType='proj/components/page'] order by @" + PROPERTY_PUBDATE_NAME + " descending", Query.XPATH);&lt;BR /&gt;query.setLimit(75);&lt;BR /&gt;final QueryResult result = query.execute();&lt;BR /&gt;if (result != null &amp;amp;&amp;amp; result.getNodes() != null) {&lt;BR /&gt;final NodeIterator nodeIterator = result.getNodes();&lt;BR /&gt;while (nodeIterator.hasNext()) {&lt;BR /&gt;pagePath = null; templateTitle = null; Calendar releaseDate = null;&lt;BR /&gt;final Node node = nodeIterator.nextNode();&lt;BR /&gt;if (node != null) {&lt;BR /&gt;final Map&amp;lt;String, Object&amp;gt; nodePropertyMap = new HashMap&amp;lt;String, Object&amp;gt;();&lt;BR /&gt;if (node.hasProperty(PROPERTY_JCR_TITLE)) {&lt;BR /&gt;templateTitle = node.getProperty(PROPERTY_JCR_TITLE).getString(); nodePropertyMap.put(PROPERTY_JCR_TITLE, templateTitle);&lt;BR /&gt;} if (node.hasProperty(PROPERTY_PUBDATE_NAME)) {&lt;BR /&gt;releaseDate = node.getProperty(PROPERTY_PUBDATE_NAME).getDate(); nodePropertyMap.put(PROPERTY_PUBDATE_NAME, releaseDate);&lt;BR /&gt;} pagePath = node.getPath();&lt;BR /&gt;nodePropertyMap.put("path", pagePath);&lt;BR /&gt;dataList.add(nodePropertyMap); } }&lt;BR /&gt;&lt;BR /&gt;//workaround added below &lt;A href="https://helpx.adobe.com/au/experience-manager/kb/Unclosed-ResourceResolver-warnng-at-com-day-cq-search-impl-builder-QueryBuilderImpl.html" target="_blank" rel="noopener"&gt;https://helpx.adobe.com/au/experience-manager/kb/Unclosed-ResourceResolver-warnng-at-com-day-cq-search-impl-builder-QueryBuilderImpl.html &lt;/A&gt;&lt;BR /&gt;final NodeIterator closeableNodeIterator = result.getNodes();&lt;BR /&gt;if(Objects.nonNull(closeableNodeIterator)){&lt;BR /&gt;while (closeableNodeIterator.hasNext()) {&lt;BR /&gt;final Node closeableNode = closeableNodeIterator.nextNode();&lt;BR /&gt;if(Objects.nonNull(adapterManager)){&lt;BR /&gt;//&amp;nbsp;&lt;A href="https://experienceleaguecommunities.adobe.com/t5/adobe-experience-manager/how-to-convert-a-node-to-a-resource/qaq-p/191875" target="_blank"&gt;https://experienceleaguecommunities.adobe.com/t5/adobe-experience-manager/how-to-convert-a-node-to-a-resource/qaq-p/191875&lt;/A&gt;&lt;BR /&gt;Resource closeableResource = adapterManager.getAdapter(closeableNode, Resource.class);&amp;nbsp;&lt;BR /&gt;&lt;BR /&gt;if(Objects.nonNull(closeableResource)){&amp;nbsp;&lt;BR /&gt;closeableResource.getResourceResolver().close(); } } } } }&lt;BR /&gt;} catch (final RepositoryException e) { logger.error(e.getMessage());&lt;BR /&gt;} finally { if (null != resolver) { resolver.close(); }&lt;BR /&gt;} return dataList;&lt;BR /&gt;&lt;BR /&gt;&lt;LI-USER uid="1439549"&gt;&lt;/LI-USER&gt;&amp;nbsp;&lt;/P&gt;&lt;DIV class=""&gt;&lt;LI-USER uid="5042721"&gt;&lt;/LI-USER&gt;&amp;nbsp;&lt;LI-USER uid="755618"&gt;&lt;/LI-USER&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV class=""&gt;&amp;nbsp;&lt;/DIV&gt;</description>
      <pubDate>Tue, 23 Mar 2021 13:14:00 GMT</pubDate>
      <guid>https://experienceleaguecommunities.adobe.com/t5/experience-manager-guides/aem-6-4-8-3-unclosed-resourceresolver-from-custom-service-in/m-p/401098#M19</guid>
      <dc:creator>akashdeep_mishra</dc:creator>
      <dc:date>2021-03-23T13:14:00Z</dc:date>
    </item>
    <item>
      <title>Re: AEM 6.4.8.3 Unclosed resourceResolver from custom ser...</title>
      <link>https://experienceleaguecommunities.adobe.com/t5/experience-manager-guides/aem-6-4-8-3-unclosed-resourceresolver-from-custom-service-in/m-p/401121#M20</link>
      <description>&lt;P&gt;The linked post is specific to the QueryBuilder. This code does not use QueryBuilder and thus does not apply here. The code is a bit hard to read due to lack of formatting, but this is what this code should look like (making a few guesses):&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;LI-CODE lang="java"&gt;List&amp;lt;Map&amp;lt;String, Object&amp;gt; dataList = new ArrayList&amp;lt;&amp;gt;();
ResourceResolver resolver = null;
try {
    resolver = resourceResolverFactory.getServiceResourceResolver(Collections.singletonMap(ResourceResolverFactory.SUBSERVICE, ServiceUser.READ_ONLY_SERVICE.toString());
    final Session session = resolver.adaptTo(Session.class);
    final Query query = session.getWorkspace().getQueryManager().createQuery("/jcr:root" + nodePath + "/element(*,nt:base)[sling:resourceType='proj/components/page'] order by @" + PROPERTY_PUBDATE_NAME + " descending", Query.XPATH);
    query.setLimit(75);
    final QueryResult result = query.execute();
    if (result != null &amp;amp;&amp;amp; result.getNodes() != null) {
        final NodeIterator nodeIterator = result.getNodes();
        while (nodeIterator.hasNext()) {
            final Node node = nodeIterator.nextNode();
            if (node != null) {
                final Map&amp;lt;String, Object&amp;gt; nodePropertyMap = new HashMap&amp;lt;&amp;gt;();
                if (node.hasProperty(PROPERTY_JCR_TITLE)) {
                    nodePropertyMap.put(PROPERTY_JCR_TITLE, node.getProperty(PROPERTY_JCR_TITLE).getString());
                }
                if (node.hasProperty(PROPERTY_PUBDATE_NAME)) {
                    nodePropertyMap.put(PROPERTY_PUBDATE_NAME, node.getProperty(PROPERTY_PUBDATE_NAME).getDate());
                }
                nodePropertyMap.put("path", node.getPath());
                dataList.add(nodePropertyMap);
            }
        }
    }
} catch (final RepositoryException e) {
    logger.error(e.getMessage());
} finally {
    if (null != resolver) {
        resolver.close();
    }
}
return dataList;&lt;/LI-CODE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;It would, of course, be better to use&amp;nbsp;&lt;FONT face="courier new,courier"&gt;try-with-resources&lt;/FONT&gt;, but I didn't do that in this example because I wasn't sure that was available in 6.4.8, but per&amp;nbsp;&lt;LI-USER uid="1439549"&gt;&lt;/LI-USER&gt;&amp;nbsp;'s comment it is.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;When a &lt;FONT face="courier new,courier"&gt;ResourceResolver&lt;/FONT&gt; is left unclosed, the logged stack trace will point to exactly where the &lt;FONT face="courier new,courier"&gt;ResourceResolver&lt;/FONT&gt; was created (which you can actually see an example of in the linked post about the QueryBuilder).&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Thu, 25 Mar 2021 20:33:54 GMT</pubDate>
      <guid>https://experienceleaguecommunities.adobe.com/t5/experience-manager-guides/aem-6-4-8-3-unclosed-resourceresolver-from-custom-service-in/m-p/401121#M20</guid>
      <dc:creator>justin_at_adobe2</dc:creator>
      <dc:date>2021-03-25T20:33:54Z</dc:date>
    </item>
    <item>
      <title>Re: AEM 6.4.8.3 Unclosed resourceResolver from custom ser...</title>
      <link>https://experienceleaguecommunities.adobe.com/t5/experience-manager-guides/aem-6-4-8-3-unclosed-resourceresolver-from-custom-service-in/m-p/401579#M21</link>
      <description>The ResourceResolver implements AutoClosable for quite some time, and the AEM 6.4 definitely ships with that ability.</description>
      <pubDate>Thu, 25 Mar 2021 20:30:28 GMT</pubDate>
      <guid>https://experienceleaguecommunities.adobe.com/t5/experience-manager-guides/aem-6-4-8-3-unclosed-resourceresolver-from-custom-service-in/m-p/401579#M21</guid>
      <dc:creator>Jörg_Hoh</dc:creator>
      <dc:date>2021-03-25T20:30:28Z</dc:date>
    </item>
  </channel>
</rss>

