2016-09-21 7 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) 

私も

(17.10ロックとトランザクションを参照してください)、ノードhereをロックする方法について提案したアプローチに従ってください:私が行っているが、私はまだ以下のような古いアイテムの例外を取得

ここに私のコードの簡略化されたバージョンは、ロック手順になるとき

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"); 

これは2つの異なるインスタンスで実行されることに注意してくださいstered)を同時に行うことができます。

上記のコードでわかるように、ノードに追加されたロックを保存しようとすると爆発しますが、これは先に共有したlinkに記載されている推奨事項です。 2つのインスタンスが同じノードにロックを追加しようとしていたため、なぜそれが爆発するのか理解しています。ロックがノードに追加されたときには、2つのプロパティ(:lockOwnerとJCR:JCR lockIsDeep)を添加することにより、ノードを変更、インスタンス1次いでインスタンスをロックを追加した場合SO 2ロックを加え、そしてインスタンス1インスタンス2がロックを追加してノードを変更したため、古いアイテムを保存しようとしました...どうしてこれが起こるのを防ぐのですか?

ご協力いただきありがとうございます。

答えて

0

を取得するためにノードを強制的にnode.refresh(false)と試みることができる私は何とかこのトピックを見つけ、あなたのコードをチェックして、ここにあなたが間違って何をすべきかあなたがベースのセッションを取得していることですしたがって、クラスター化されたリポジトリーは、クラスター化されたノードに適用されていないため、ロックを認識できません。あなたが代わりに行っているはずです何

は、次の操作を実行することです:特に制限列の下 https://wiki.apache.org/jackrabbit/Clustering#Concurrent_Write_Behavior

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

詳しい情報はで見つけることができます。

0

たぶん、あなたが彼のキャッシュを更新し、新しい変更に

+0

いつ更新を実行しますか?保存の直前またはロックの前に?また、ドキュメント[here](https://docs.adobe.com/content/docs/en/spec/jsr170/javadocs/jcr-2.0/javax/jcr/Item.html#refresh(boolean))には、すべてのリフレッシュ(false)が適用されると、現在のセッションの変更がクリアされます。しかし私は自分の問題は他のセッションで適用された変更に関連していると思いますか? – zalis

+0

保存する前に。ノードがすでに変更されていると、それは使用できなくなります。 しかし、あなたは正しいかもしれませんが、リフレッシュが実際に現在のセッションで保留中のすべての変更を「リセット」しているという誤解がありました。私はクラスタ化された環境でJackrabbitを正直に使ったことはありません – Nico

関連する問題