Multithreading 多集群环境下的JCR锁定

Multithreading 多集群环境下的JCR锁定,multithreading,locking,cluster-computing,jcr,jackrabbit,Multithreading,Locking,Cluster Computing,Jcr,Jackrabbit,在向同一集群的不同实例中执行的JCR节点添加内容时,我一直在努力找到一个可行的解决方案 已经解释过,“当多个集群节点写入相同节点时,必须首先锁定这些节点” 我已经这样做了,但仍然会出现如下陈旧项目异常: javax.jcr.InvalidItemStateException: Unable to update a stale item: item.save() at org.apache.jackrabbit.core.ItemSaveOperation.perform(ItemSaveOper

在向同一集群的不同实例中执行的JCR节点添加内容时,我一直在努力找到一个可行的解决方案

已经解释过,“当多个集群节点写入相同节点时,必须首先锁定这些节点”

我已经这样做了,但仍然会出现如下陈旧项目异常:

javax.jcr.InvalidItemStateException: Unable to update a stale item: item.save()
at org.apache.jackrabbit.core.ItemSaveOperation.perform(ItemSaveOperation.java:262)
at org.apache.jackrabbit.core.session.SessionState.perform(SessionState.java:216)
at org.apache.jackrabbit.core.ItemImpl.perform(ItemImpl.java:91)
at org.apache.jackrabbit.core.ItemImpl.save(ItemImpl.java:329)
at org.apache.jackrabbit.core.session.SessionSaveOperation.perform(SessionSaveOperation.java:65)
at org.apache.jackrabbit.core.session.SessionState.perform(SessionState.java:216)
at org.apache.jackrabbit.core.SessionImpl.perform(SessionImpl.java:361)
at org.apache.jackrabbit.core.SessionImpl.save(SessionImpl.java:812)
我还按照建议的方法锁定节点(参见17.10锁定和事务)

这里是我的代码在锁定过程中的简化版本

    session.getRootNode().addNode("one").addMixin("mix:lockable");
    session.save();
    session.getWorkspace().getLockManager().lock("/one", true, true, 5000, session.getUserID());
    session.save();// usually it explodes here
    session.getNode("/one").addNode("two").addMixin("mix:lockable");
    session.save();
    session.getWorkspace().getLockManager().unlock("/one");
请注意,这将同时在两个不同的实例(集群)上执行

正如您在上面的代码中所看到的,在我尝试保存刚刚添加到节点的锁后,它会爆炸,但是这是我在前面的共享文件中所述的建议。 我理解它为什么会爆炸,这是因为两个实例试图在同一个节点上添加锁。将锁添加到节点时,它会通过添加两个属性(jcr:lockOwner和jcr:lockIsDeep)来修改节点,因此如果实例1添加了锁,则实例2添加了锁,并且实例1尝试保存,则会得到过时的项,因为实例2通过向节点添加锁修改了节点。。。那么我该如何防止这种情况发生呢


非常感谢您的支持

也许您可以尝试使用
节点。刷新(false)
强制节点刷新其缓存并获得新的修改

我不知何故找到了此主题并检查了您的代码,这里的错误是您获得了一个基于会话的锁,所以您的集群存储库不知道该锁,因为它不应用于集群节点

您应该做的是执行以下操作:

session.getWorkspace().getLockManager().lock("/one", true, false, 5000, session.getUserID());
有关更多信息,请访问:
特别是在“限制”列下。

何时执行刷新?在保存之前还是锁定之前?在文档中还声明,如果应用了刷新(false),则当前会话的所有更改都将被清除。但我认为我的问题与保存之前其他会话应用的更改有关。如果该节点已被修改,则无论如何它都将不可用。但你可能是对的,我误解了刷新实际上只是“重置”当前会话中所有未决的修改。老实说,我从未在集群环境中使用过Jackrabbit