0

我有一个与 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();
    }
}

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

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

谢谢。

4

1 回答 1

3

我曾经创建 resourceResolver 并重用它的方法是否正确?是不断吗?

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

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

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

顺便说一句,resourceResolver 和他们的会话存在多长时间,我在哪里可以看到它?

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

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

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

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

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

于 2017-02-08T09:16:33.923 回答