如何解锁由开放式锁定的Jackrabbit中的节点?

时间:2012-11-26 10:14:38

标签: java jackrabbit

我使用以下代码锁定了一个节点

ocm.lock("/path1", true, true);

这里第三个参数为true,表明它是Open-scoped Locks.

它已成功锁定。

但现在我正在编写一个新的Java程序来解锁一个节点。

boolean b1 = ocm.isLocked("/path1");
System.out.println(b1);                      // RETURNS TRUE.
Node n = session.getNode("/path1");
Lock l = n.getLock();
ocm.unlock("/path1", l.getLockToken());

但我在这里得到例外。而且它没有解锁节点。

ERROR [main] ObjectContentManagerImpl.java:957 Cannot unlock path: /path1 Jcr user: admin has no lock token to do this. Lock was placed with user: admin
Exception in thread "main" org.apache.jackrabbit.ocm.exception.IllegalUnlockException
    at org.apache.jackrabbit.ocm.manager.impl.ObjectContentManagerImpl.unlock(ObjectContentManagerImpl.java:958)
    at ocm.UnlockNode.main(UnlockNode.java:36)

我如何解锁节点?

我的UnlockNode.java代码。

Repository repository = new URLRemoteRepository("http://localhost:8083/rmi");
Session session = repository.login(new SimpleCredentials("admin","admin".toCharArray()));
Mapper mapper = new AnnotationMapperImpl(classes);
ObjectContentManager ocm = new ObjectContentManagerImpl(session, mapper);

LockManager lm = session.getWorkspace().getLockManager();
lm.addLockToken("a096a79c-5edf-4a17-baa4-aba01f8013d8-J");
boolean b1 = ocm.isLocked("/path1");
System.out.println(b1);
try {
    ocm.unlock("/path1","a096a79c-5edf-4a17-baa4-aba01f8013d8-J");
}catch (Exception e) {
    System.out.println(e);
}

感谢。

1 个答案:

答案 0 :(得分:0)

听起来你正试图从其他会话中获取锁定......

  

java.lang.String getLockToken()

     

可以为此返回锁定令牌   锁。如果此锁是开放范围的,并且当前会话保持不变   此锁的锁定标记,或存储库选择公开   将令牌锁定到当前会话,然后此方法将返回该值   锁定令牌。否则此方法将返回null。

锁定后获取锁定令牌,并将其存储以供日后使用,或者使用checkUnlock()方法编写自己的LockManager,以执行您想要的操作。