2017-02-07 15 views
0

JCR에서 작동하는 osgi 구성 요소 (예 : CRUD)가 있습니다.Sling/Jackrabbit - 해결 자/세션 수명 및 동시 일관성

@Component 
@Service 
public class SomeServiceImpl implements SomeService { 

    @Reference 
    private ResourceResolverFactory resourceResolverFactory; 

    private ResourceResolver resourceResolver; 

    @Activate 
    private void init() { 
     resourceResolver = resourceResolverFactory.getServiceResourceResolver(
       Collections.singletonMap(ResourceResolverFactory.SUBSERVICE, "myService")); 
    } 

    @Override 
    public void serve() { 
     //does something with resourceResolver 
    } 

    @Deactivate 
    private void dispose() { 
     resourceResolver.close(); 
    } 
} 

이 서비스가 활성 상태 인 동안 resourceResolver의 새 인스턴스가 만들어지고 유지됩니다. 때때로이 서비스는 외부에서 호출됩니다.

내 질문은 : 내가 한 번 resourceResolver를 생성하고 재사용 올바른 접근 방식은

  1. 인가? 끊임없이 그렇습니까?
  2. 기본 세션이 만료되지 않는다는 보장이 있습니까?
  3. By the way resourceResolver와 세션의 수명은 어디에서 볼 수 있습니까?
  4. 동시성은 어떻습니까? 이 서비스가 병렬로 서버 위치에서 호출된다고 상상해보십시오. Jackrabbit이 일관성을 보장합니까?
  5. @Component 
    @Service 
    public class SomeServiceImpl implements SomeService { 
    
        @Reference 
        private SlingRepository slingRepository; 
    
        private Session session; 
    
        @Activate 
        private void init() { 
         session = slingRepository.login(); 
        } 
    
        @Override 
        public void serve() { 
         //does something with session 
        } 
    
        @Deactivate 
        private void dispose() { 
         session.logout(); 
        } 
    } 
    

    (세션 구현) 다른 서비스에 대한 같은 질문


.

가능한 경우 몇 가지 교정본을 보는 것이 좋습니다. 어쩌면 문서들 ...

고마워.

답변

3

resourceResolver를 만들고 재사용하는 올바른 접근 방식입니까? 끊임없이 그렇습니까?

아니요, 아닙니다. 나쁜 습관의 완벽한 예입니다. resourceResolver의 생성은 가볍고 필요한만큼 만들 수 있습니다. 참고 : 사용 후 항상 resourceResolver을 닫아야하지만주의해서 조기에 닫지 마십시오.

기본 세션이 만료되지 않는다는 보장이 있습니까?

아니요. AEM은 얼마 후 닫히지 않은 세션을 수집합니다.

By the way resourceResolver와 세션의 수명은 어디에서 볼 수 있습니까?

이 세션은 동일한 리소스에 대한 첫 번째 동시 쓰기 후에 유효하지 않게됩니다. IRL은 ​​충돌이없는 경우에도 많은 양의 변경 사항을 저장시 실패 할 수 있습니다.

동시성이란 무엇입니까? 이 서비스가 병렬로 서버 위치에서 호출된다고 상상해보십시오. Jackrabbit이 일관성을 보장합니까?

JCR 세션은 하나의 세션 범위에서 동시성을 지원합니다. 주요 가정은 항상 새로운 세션 당 업데이트 요청을 만듭니다.

다른 서비스 (세션 구현 포함)에 대해 동일한 질문이 있습니다.

ResourceResolverSession 이상에서 작동하며 API 수준 만 있습니다.

+0

많은 의견을 보내 주셔서 감사합니다. – Alex

+0

나는 "AEM이 잠시 후 닫히지 않은 세션을 수집 중입니다."라는 정보를 찾을 수 있습니다. 이 기사 (http://tech.ethomasjoseph.com/2015/09/sling-who-is-closing-my-jcr-session.html)에서는 ResourceResolver의 기본 JCR 세션을 닫을 때 ResourceResolver 오브젝트는 수집 된 가비지입니다. AEM에 실제 작업이 있다는 것을 의미합니까? 일정 기간 동안 닫히지 않은 세션이 닫히거나 기사 동작에서 언급 되었습니까? – Alex

+0

"AEM이 잠시 후 닫히지 않은 세션을 수집 중입니다."에 대한 참조가 있습니까? ? 제품에서 이러한 기능을 인식하지 못했습니다. –