Sling / Jackrabbit - 解析器/会话生命周期及其并发一致性

时间:2017-02-07 16:08:02

标签: osgi jcr sling jackrabbit jackrabbit-oak

我有一个与JCR一起使用的osgi组件(例如,CRUD)。

@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的新实例并保留它。有时会在外面调用此服务。

我的问题是:

  1. 我曾经创建过resourceResolver并重用它的方法是否正确?这是不断的?
  2. 我是否保证基础会话不会过期?
  3. 顺便说一下,R​​esourceResolver和他们的会话有多长,我在哪里可以看到它?
  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();
        }
    }
    

    另一项服务的相同问题(使用会话实施)。

    如果有可能,可以看到一些证据。也许是文档......

    感谢。

1 个答案:

答案 0 :(得分:3)

  

我曾经创建过ResourceResolver并重用它的方法是否正确?这是不断的?

不,不是。这是不良做法的完美范例。创建resourceResolver是轻量级的,您可以根据需要创建。 注意:您必须在使用后始终关闭resourceResolver,但要小心并且不要提前关闭它。

  

我是否保证基础会话不会过期?

不,你没有。 AEM在一段时间后收集未结算的会议。

  

顺便说一下,R​​esourceResolver和他们的会话有多长,我在哪里可以看到它?

首次并发写入同一资源后,此会话将失效。即使没有冲突,IRL的大量变化也可能在保存时失败。

  

并发性怎么样?想象一下,这个服务是从几个地方平行调用的,Jackrabbit能保证我的一致性吗?

JCR会话支持一个会话范围内的并发。主要假设将始终为每个更新请求创建新会话。

  

另一项服务的相同问题(使用会话实施)。

ResourceResolver正在处理Session它只是更高级别的API。