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

위의 코드에서 볼 수 있듯이 노드에 추가 된 잠금을 저장하려고 시도한 후에 폭발합니다. 그러나 이는 이전에 공유 한 link에 명시된 권장 사항입니다. 두 노드가 같은 노드에 잠금을 추가하려고했기 때문에 이것이 왜 폭발하는지 이해합니다. 예 1 잠금 다음 예 2 잠금 추가 첨가하여 경우에 따라서, 그리고 INSTANCE1 잠금이 노드에 부가 될 때, 두 등록 정보 (lockIsDeep : lockOwner 및 JCR JCR)을 첨가하여 노드를 수정 인스턴스 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

언제 새로 고침을 수행 하시겠습니까? 저장하기 직전이나 잠금 전에? 또한 문서 [여기] (https://docs.adobe.com/content/docs/en/spec/jsr170/javadocs/jcr-2.0/javax/jcr/Item.html#refresh (boolean))에는 모든 새로 고침 (false)이 적용되면 현재 세션에 대한 변경 사항이 지워집니다. 하지만 내 문제는 다른 세션에서 적용된 변경 사항과 관련이 있다고 생각하십니까? – zalis

+0

저장하기 전에. 노드가 이미 수정 된 경우에는 사용할 수 없게됩니다. 어쩌면 맞을지도 모르겠지만, 실제로 새로 고침이 현재 세션에서 수정을 보류중인 모든 "재설정"사실을 오해했습니다. 솔직히 말해서 클러스터 환경에서 Jackrabbit을 사용한 적이 한번도 없습니다. – Nico