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

Sling / Jackrabbit - resolver / session lifetime and its concurrent consistency

我有一个与 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. 顺便问一下,resourceResolver 及其会话存在多长时间,我在哪里可以看到它?
  4. 并发呢?想象一下这个服务是从几个地方并行调用的,Jackrabbit 能保证一致性吗?

@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();
    }
}

另一个服务的相同问题(会话实现)。

如果可能的话,看到一些证明会很高兴。也许文档...

谢谢。

Is it correct approach where I once create resourceResolver and reuse it? Is it constantly?

不,不是。这是不良做法的完美例子。 resourceResolver 的创建是轻量级的,您可以根据需要创建任意多个。 注意:您必须在使用后始终关闭 resourceResolver,但要小心,不要过早关闭它。

Do I have guarantees that underlying session will not be expired?

不,你不知道。 AEM 会在一段时间后收集未关闭的会话。

By the way How long resourceResolver and their session lives and where can I see it?

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

What about concurrency? Imagine this service is invoked from serveral places parallely, Does Jackrabbit guarantee me consistency?

JCR 会话支持一个会话范围内的并发。每次更新请求总是创建新会话的主要假设。

The same questions for another service (with session implementation).

ResourceResolver 正在 Session 上工作,它只是 API 的更高级别。