com.day.cq.search.impl.builder.QueryBuilderImpl で ResourceResolver 警告が閉じられない
com.day.cq.search.impl.builder.QueryBuilderImpl で閉じられていない ResourceResolver 警告を解決する方法を説明します。
説明 description
環境
AEM 6.5
問題/症状
QueryBuilderImpl クラスから生成されたログに、閉じられていないセッション警告があります。11.01.2018 01:03:18.878 *INFO* [ Apache Sling Resource Resolver Finalizer Thread]
11.01.2018 01:03:18.878 *INFO* [ Apache Sling Resource Resolver Finalizer Thread] org.apache.sling.resourceresolver.impl.CommonResourceResolverFactoryImpl 閉じられていない ResourceResolver が次の場所で作成されました:
java.lang.Exception: Stacktrace
at.apache.sling.resourceresolver.impl.impl.CommonResourceResolver.Resolver を開 Impl.CommonFactoryResolverImpl$Resolver 参照。< init> (CommonResourceResolverFactoryImpl.java:521)
at org.apache.sling.resourceresolver.impl.CommonResourceResolverFactoryImpl.register (CommonResourceResolverFactoryImpl.java:218)
at org.apache.sling.resourceresolver.impl.ResourceResolverImpl.< init> (ResourceResolverImpl.java:101)
at org.apache.sling.resourceresolver.impl.ResourceResolverImpl.< init> (ResourceResolverImpl.java:94)
at org.apache.sling.resourceresolver.impl.CommonResourceResolverFactoryImpl.getResourceResolverInternal (CommonResourceResolverFactoryImpl.java:263)
at org.apache.sling.resourceresolver.impl.CommonResourceResolverFactoryImpl.getResourceResolver (CommonResourceResolverFactoryImpl.java:1 73)
at org.apache.sling.resourceresolver.impl.ResourceResolverFactoryImpl.getResourceResolver (ResourceResolverFactoryImpl.java:105)
at com.day.cq.search.impl.builder.QueryBuilderImpl.createResourceResolver (QueryBuilderImpl.java:210)
at com.day.cq.search.impl.builder.QueryImpl.getResourceResolver (Java:23 1)
at com.day.cq.search.impl.result.HitImpl.getResource (HitImpl.java:108)
at com.day.cq.search.writer.SimpleHitWriter.writeSimpleJson (SimpleHitWriter.java:54)
at com.day.cq.search.writer.SimpleHitWriter.write (SimpleHitWriter.java:41)
at com.day.cq.search.impl.servlets.QueryBuilderJsonServlet.writeHits (Query) BuilderJsonServlet.java:165)
at com.day.cq.search.impl.servlets.QueryBuilderJsonServlet.handleQuery (QueryBuilderJsonServlet.java:113)
at com.day.cq.search.impl.servlets.QueryBuilderJsonServlet.doGet (QueryBuilderJsonServlet.java:73)
at org.apache.sling.api.servlets.SlingSafeMethodsServlet.Service slingSafeMethodsServlet.java:270)
at org.apache.sling.api.servlets.SlingAllMethodsServlet.mayService (SlingAllMethodsServlet.java:140)
at org.apache.sling.api.servlets.SlingSafeMethodsServlet.service (SlingSafeMethodsServlet.java:346)
at org.apache.sling.sling.api.servlapi.servlets.servlets.servlets.SlingSlingSafeMethods Servlet.service (SlingSafeMethodsServlet.java:378)
at org.apache.sling.engine.impl.request.RequestData.service (RequestData.java:552)
at org.apache.sling.engine.impl.filter.SlingComponentFilterChain.render (SlingComponentFilterChain.java:44)
解決策 resolution
ライブのAEM サイトでは、/bin/querybuilder URL を Dispatcher でブロックすることをお勧めします。
これらの URL は、(内部ネットワークに接続した)オーサーインスタンスでは安全に使用できますが、ライブサイトでは、システムを開いてデータを開示できる可能性があります。
このバグの回避策は、/bin/querybuilder サーブレットの使用を避け 代わりに QueryBuilder API を使用することです。
API を呼び出した後、クエリ結果を処理した後に ResourceResolver を手動で閉じます。
サンプルコードは こちらで確認してください。 例えば、次のコードはリソースリゾルバーを漏洩しています。
Query query = queryBuilder.createQuery (…, session);
SearchResult result = query.getResult ();
for (ヒット : result.getHits ())) {
// do 一部の処理
}
回避策コード:
//回避策:内部リソースリゾルバー
Iterator< Resource> resources = result.getResources ();
if (resources.hasNext ()) {
resources.next ().getResourceResolver ().close ();
} を閉じます