2016-12-13 38 views
1

我正在爲多個節點進行更新,然後使用命令「Activate」以批量發佈(大量數據)以編程方式發佈節點,但有時我不知道爲什麼我有時會遇到錯誤。它迄今爲止只發生過幾次,所以我很難弄清楚導致問題的原因是什麼。遇到activationStatus在發佈時已被外部修改

這是拋出的錯誤。

Caused by: org.apache.jackrabbit.core.state.StaleItemStateException: 8b3ce2d4-eb7b-4838-901c-413aa9eeee84/{http://www.magnolia.info/jcr/mgnl}activationStatus has been modified externally 
    at org.apache.jackrabbit.core.ItemSaveOperation.removeTransientItems(ItemSaveOperation.java:723) 
    at org.apache.jackrabbit.core.ItemSaveOperation.perform(ItemSaveOperation.java:228) 

有沒有人遇到過類似的問題?或者有什麼想法在哪裏看這個問題?

謝謝! :)

+0

我假設您使用的是異步命令,因此可以更改其狀態,直到另一個人處理該案例。如果你以編程的方式做到這一點,我會建議嘗試一下,如果它有助於有一些Thread.sleep()之間的時間。如果問題確實是時機,我們可以做一些事情,比如在操作完成時收聽等。 – Ducaz035

+0

Hi @ Ducaz035,這個命令是異步的嗎?我正在執行這一個: 命令cmd =((CommandsManager)Components.getComponent(CommandsManager.class))。getCommand(「」,「activate」); 上下文ctx = new SimpleContext(); Map params = new HashMap <>(); params.put(「repository」,workspaceName); params.put(「uuid」,uuid); params.put(「recursive」,true); ctx.putAll(params); cmd.execute(ctx); –

+0

另外,我不太明白實際發生了什麼?爲什麼activationStatus是外部修改的?除了這個作者實例外,只有一個作者實例,沒有人觸及公共實例。你能否幫助解釋發生這種情況的情況?非常感謝! –

回答

1

基本上更新操作內部導致木蘭修改激活狀態(這是正確的)。當此操作正在進行時,更新操作正在接管並嘗試更改狀態。在這種情況下,如果你不幸,你可能會遇到你得到的例外。推理是這些命令運行異步但觸摸相同的節點。

潛在的解決方案:

1)你可能只是給一些時間,第一次手術完成後執行第二個。

2)這需要一些開發工作,但在這裏我們去:

您可以使用鎖管理器鎖定正在使用的第一操作節點和解鎖時的操作是完全做得到。第二次操作同時會檢查節點是否被鎖定,如果是,則不會繼續,而是等待從第一個進程解鎖。

+0

好指出,謝謝!我會嘗試第一個。謝謝! :) –