2016-08-10 25 views
0

単一のボックスcq5作成者環境で、次の例外が発生しています。javax.jcr.InvalidItemStateException:アイテムを保存することができません

javax.jcr.InvalidItemStateException: Item cannot be saved 
because node property has been modified externally 

より多くの例外の詳細:

adminResourceResolver = resourceResolverFactory 
       .getAdministrativeResourceResolver(null); 
Resource fundPageResource = adminResourceResolver.getResource(page 
       .getPath() + "/jcr:content"); 
ModifiableValueMap homePageResourceProperties = fundPageResource 
       .adaptTo(ModifiableValueMap.class); 
homePageResourceProperties.put("ssn",(person.getSsn()); 

adminResourceResolver.commit(); 

任意のアイデア:ここ

Caused by: 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) 
    at com.day.crx.core.CRXSessionImpl.save(CRXSessionImpl.java:142) 
    at org.apache.sling.jcr.resource.internal.helper.jcr.JcrResourceProvider.commit(JcrResourceProvider.java:511) 
    ... 215 more 
Caused by: org.apache.jackrabbit.core.state.StaleItemStateException: 3bec1cb7-9276-4bed-a24e-0f41bb3cf5b7/{}ssn has been modified externally 
    at org.apache.jackrabbit.core.state.SharedItemStateManager$Update.begin(SharedItemStateManager.java:679) 
    at org.apache.jackrabbit.core.state.SharedItemStateManager.beginUpdate(SharedItemStateManager.java:1507) 
    at org.apache.jackrabbit.core.state.SharedItemStateManager.update(SharedItemStateManager.java:1537) 
    at org.apache.jackrabbit.core.state.LocalItemStateManager.update(LocalItemStateManager.java:400) 
    at org.apache.jackrabbit.core.state.XAItemStateManager.update(XAItemStateManager.java:354) 
    at org.apache.jackrabbit.core.state.LocalItemStateManager.update(LocalItemStateManager.java:375) 
    at org.apache.jackrabbit.core.state.SessionItemStateManager.update(SessionItemStateManager.java:275) 
    at org.apache.jackrabbit.core.ItemSaveOperation.perform(ItemSaveOperation.java:258) 

は、コードサンプルのですか?このコードにアクセスする複数のスレッドが、複数のページ上の複数の作成者として、作成されたコンポーネントからこのコードを呼び出す可能性があります。

これはあなたのCQ5.5にしばしば見誤りである(と上向きに各バージョンを軽減)、 スリ

+1

投稿するコードはありますか? –

+0

@A_Arnoldコードから抽出したコードサンプルをご覧ください。 – Sri

答えて

3

、ありがとうございました。この問題の根本的な原因は、複数のプロセス/サービスが同じリソースをほぼ同じ時間幅で変更していることです(通常は異なるセッションを使用します。

おそらく例を示す小さな例です。セッションAとセッションBはどちらもリソースXへの参照を持ちます。セッションAは、Xの一部のプロパティを変更し、保存してコミットし、破棄されます。これはすべてスムーズに行く。セッションBはまだAの修正が行われる前の状態のスナップショットを保持しており、セッションBは修正を行い、保存しようとするまでうまくいっているようです。この時点で、セッションBは最新のノード状態を持たないため、変更をコミットできないことを検出します。他のセッションが同じノードに変更を加えたことが検出されました。本質的に、現在のノード状態は、セッションAが行った変更と矛盾し、ItemStale例外をスローします。この例外の理由は、Aが行った変更を保持し、現在のセッションによって行われた変更を保持し、Aによる変更を破棄したり、それらをマージしたりすることをAPIが知らないという考え方です。

このエラーは、長時間実行されているセッションやワークフローとリスナーの組み合わせで頻繁に発生します。したがって、できるだけこのような競合を避けるために、できるだけセッションを短くすることをお勧めします。

これに対処する方法の1つは、.save()を呼び出す前にsession.refresh(keepChangesBoolean)を呼び出すことです。これは、現在のセッションに、他のセッションによって行われた更新をチェックし、送信したブール値フラグに従ってそれを処理するように指示します。ただし、リフレッシュとセーブコールの間にまだ別のセッションが同じことを行っている可能性があるので、これは保証ではありません。この例外が発生する確率は低下します。 これに対処する別の方法は、最初からもう一度やり直すことです。

+0

ありがとう@ 3xil3、それは理にかなっています。私は、JCRアプリケーションではなく、通常のwebappでトランザクションを処理する方法を知っています。 – Sri

関連する問題