我有一个与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的新实例并保留它。有时会在外面调用此服务。
我的问题是:
@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();
}
}
另一项服务的相同问题(使用会话实施)。
如果有可能,可以看到一些证据。也许是文档......
感谢。
答案 0 :(得分:3)
我曾经创建过ResourceResolver并重用它的方法是否正确?这是不断的?
不,不是。这是不良做法的完美范例。创建resourceResolver
是轻量级的,您可以根据需要创建。
注意:您必须在使用后始终关闭resourceResolver
,但要小心并且不要提前关闭它。
我是否保证基础会话不会过期?
不,你没有。 AEM在一段时间后收集未结算的会议。
顺便说一下,ResourceResolver和他们的会话有多长,我在哪里可以看到它?
首次并发写入同一资源后,此会话将失效。即使没有冲突,IRL的大量变化也可能在保存时失败。
并发性怎么样?想象一下,这个服务是从几个地方平行调用的,Jackrabbit能保证我的一致性吗?
JCR会话支持一个会话范围内的并发。主要假设将始终为每个更新请求创建新会话。
另一项服务的相同问题(使用会话实施)。
ResourceResolver
正在处理Session
它只是更高级别的API。