同じクラスタの異なるインスタンスで実行される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がロックを追加してノードを変更したため、古いアイテムを保存しようとしました...どうしてこれが起こるのを防ぐのですか?
ご協力いただきありがとうございます。
いつ更新を実行しますか?保存の直前またはロックの前に?また、ドキュメント[here](https://docs.adobe.com/content/docs/en/spec/jsr170/javadocs/jcr-2.0/javax/jcr/Item.html#refresh(boolean))には、すべてのリフレッシュ(false)が適用されると、現在のセッションの変更がクリアされます。しかし私は自分の問題は他のセッションで適用された変更に関連していると思いますか? – zalis
保存する前に。ノードがすでに変更されていると、それは使用できなくなります。 しかし、あなたは正しいかもしれませんが、リフレッシュが実際に現在のセッションで保留中のすべての変更を「リセット」しているという誤解がありました。私はクラスタ化された環境でJackrabbitを正直に使ったことはありません – Nico