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 Unclosed ResourceResolver를 여기서 만들었습니다.
java.lang.Exception: Stacktrace
at org.apache.sling.resourceresolver.impl.CommonResourceResolverFactoryImpl$ResolverReference.<
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:173)
at org.apache.sling.resolver.resolver.impl.getResourceResolver ResolverFactoryImpl.java:105)
at com.day.cq.search.impl.builder.QueryBuilderImpl.createResourceResolver(QueryBuilderImpl.java:210)
at com.day.cq.search.impl.builder.QueryImpl.getResourceResolver(QueryImpl.java:231)
at com.day.cq.search.impl.result.HitImpl.getResource(HitImpl.java:108)
at com.day.cq.search.writer.SimpleHitWriter.writeSimpleJson(SimpleHitWriter.java:5com.day.cq.se:54){9){9 at .writer.SimpleHitWriter.write(SimpleHitWriter.java:41)
com.day.cq.search.impl.servlets.QueryBuilderJsonServlet.writeHits(QueryBuilderJsonServlet.java:165)
com.day.cq.search.impl.servlets.QueryBuilderJsonServlet.handleQuery(QueryBuilderJsonServlet.java:113)
com.day.cq.search.impl.servlets.QueryBuilderJsonServlet.doGet(QueryBuilderJsonServlet.java:73)
at org.apache.sling .servlets.SlingSafeMethodsServlet.mayService(SlingSafeMethodsServlet.java:270)
at org.apache.sling.api.servlets.SlingAllMethodsServlet.mayService(SlingAllMethodsServlet.java:140)
at org.apache.sling.api.servlets.SlingSafeMethodsServlet.service(SlingSafeMethodsServlet.service(SlingSafeServlet.service)
at org.apache.sling.sling.sling.api.servlet.servlet.SafeSafeSafeMethodsServletSafeServletSafeSafeServletSafeSafeServletService 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 을(를) 수동으로 닫으십시오.
여기에서 샘플 코드 을(를) 찾으십시오. 예를 들어 코드 누출 리소스 확인자는 다음과 같습니다.
쿼리 쿼리 = queryBuilder.createQuery(…, session);
SearchResult = query.getResult();
for (히트 : result.getHits()) {
/// do 일부 처리
}
해결 방법 코드:
// 해결 방법: internal resource resolver
반복자<
Resource>
resources = result.getResources();
if (resources.hasNext() {
resources.next().getResourceResolver().close();
}