2016-09-21 217 views
0

當向增加內容給在同一集羣的不同實例中執行的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通過添加一個鎖修改節點...所以我會如何防止這種情況發生?

非常感謝您的支持!

回答

0

不知何故,我發現這個議題,並檢查你的代碼,你有什麼錯在這裏是你獲得一個基於會話鎖,因此您的羣集存儲庫不知道該鎖,因爲它沒有應用到羣集節點。

什麼,你應該做的,而不是要做到以下幾點: https://wiki.apache.org/jackrabbit/Clustering#Concurrent_Write_Behavior 尤其是在限制列:

session.getWorkspace().getLockManager().lock("/one", true, false, 5000, session.getUserID()); 

的更多信息可以在這裏找到。

0

也許你可以用node.refresh(false)試圖迫使節點刷新自己的高速緩存,並獲得新的修改

+0

什麼時候你會執行刷新?保存之前或鎖定之前?也在文檔[這裏](https://docs.adobe.com/content/docs/en/spec/jsr170/javadocs/jcr-2.0/javax/jcr/Item.html#refresh(布爾)),它聲明所有如果應用刷新(false),則當前會話的更改將被清除。但我認爲我的問題與其他會話所應用的更改有關? – zalis

+0

保存之前。如果該節點已被修改,則無論如何將無法使用。 但你也許是對的,我誤解了刷新實際上只是「重置」當前會話中的所有未決修改的事實。說實話,我從來沒有在集羣環境中使用過Jackrabbit – Nico