Sling / Jackrabbit - время жизни резолвера / сеанса и его параллельная согласованность

У меня есть компонент OSGI, который работает с JCR (например, 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();
    }
}

Те же вопросы для другого сервиса (с реализацией сеанса).

Будет приятно увидеть некоторые доказательства, если это возможно. Может быть, документы...

Благодарю.

1 ответ

Решение

Это правильный подход, когда я однажды создаю resourceResolver и снова его использую? Это постоянно?

Нет. Это прекрасный пример плохой практики. Создание resourceResolver легкий, вы можете создать столько, сколько вам нужно. Примечание: вы должны всегда закрывать resourceResolver после использования, но будьте осторожны и не закрывайте его рано.

Есть ли у меня гарантии того, что срок действия основного сеанса не истечет?

Нет, ты не AEM собирает закрытые сессии через некоторое время.

Кстати, как долго работает resourceResolver и их сеанс и где я могу его увидеть?

Этот сеанс станет недействительным после первой параллельной записи на тот же ресурс. Большое количество изменений в IRL даже без конфликтов может потерпеть неудачу при сохранении.

А как насчет параллелизма? Представьте, что этот сервис вызывается параллельно из нескольких мест. Гарантирует ли Jackrabbit мою последовательность?

Сеанс JCR поддерживает параллелизм в рамках одного сеанса. Основное предположение, что всегда будет создавать новый сеанс для каждого запроса на обновление.

Те же вопросы для другого сервиса (с реализацией сеанса).

ResourceResolver работает над Session это просто более высокий уровень API.

Другие вопросы по тегам