當向增加內容給在同一集羣的不同實例中執行的JCR節點時,我一直在努力想出一個工作解決方案。多集羣環境中的JCR鎖定
已經解釋here「當多個集羣節點寫入相同節點時,必須首先鎖定這些節點」。
,我都做了,但我仍然會過時項例外象下面這樣:
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)
我也跟着上如何鎖定節點here建議的方法(見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");
請注意這將在兩個不同的實例(clu同時)。
正如您在上面的代碼中看到的,它在我嘗試保存剛剛添加到節點的鎖後爆炸,但是這是我前面共享的link中指出的建議。 我明白爲什麼會爆炸,這是因爲兩個實例試圖在同一個節點上添加鎖定。當鎖被添加到節點它通過添加兩個屬性(:lockOwner和JCR:JCR lockIsDeep)修改節點,因此,如果實例1加入鎖然後實例2加入鎖,和INSTANCE1試圖保存然後你得到陳舊的項目,因爲實例2通過添加一個鎖修改節點...所以我會如何防止這種情況發生?
非常感謝您的支持!
什麼時候你會執行刷新?保存之前或鎖定之前?也在文檔[這裏](https://docs.adobe.com/content/docs/en/spec/jsr170/javadocs/jcr-2.0/javax/jcr/Item.html#refresh(布爾)),它聲明所有如果應用刷新(false),則當前會話的更改將被清除。但我認爲我的問題與其他會話所應用的更改有關? – zalis
保存之前。如果該節點已被修改,則無論如何將無法使用。 但你也許是對的,我誤解了刷新實際上只是「重置」當前會話中的所有未決修改的事實。說實話,我從來沒有在集羣環境中使用過Jackrabbit – Nico