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 и сохраняет его, пока этот сервис активен. Время от времени эта услуга вызывается снаружи.
Мои вопросы:
- Это правильный подход, когда я однажды создаю resourceResolver и снова его использую? Это постоянно?
- Есть ли у меня гарантии того, что срок действия основного сеанса не истечет?
- Кстати, как долго работает resourceResolver и их сеанс и где я могу его увидеть?
- А как насчет параллелизма? Представьте, что этот сервис вызывается параллельно из нескольких мест. Гарантирует ли 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.