2016-09-21 1 views
0

J'ai eu du mal à trouver une solution qui fonctionne quand il s'agit d'ajouter du contenu aux nœuds JCR exécutés dans différentes instances du même cluster.JCR se verrouillant sur un environnement multi-cluster

Il a été expliqué here que "lorsque plusieurs nœuds de cluster écrivent sur les mêmes nœuds, ces nœuds doivent d'abord être verrouillés".

que je l'ai fait, mais je reçois toujours des exceptions article rassis comme ci-dessous:

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) 

je suis aussi l'approche proposée sur la façon de verrouiller les nœuds here, (voir 17.10 Serrures et Transactions)

Voici la version simplifiée de mon code quand il s'agit de procédures de verrouillage

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

Veuillez noter que ceci serait exécuté sur deux instances différentes (clu triché) en même temps.

Comme vous pouvez le voir dans mon code ci-dessus, il explose après avoir essayé d'enregistrer le verrou qui vient d'être ajouté au nœud, mais c'est la recommandation qui est indiquée dans le link que j'ai partagé plus tôt. Je comprends pourquoi il explose, c'est parce que deux instances essayaient d'ajouter un verrou sur le même nœud. Lorsqu'une serrure est ajouté à un noeud modifie le noeud en ajoutant deux propriétés (jcr: lockOwner et jcr: lockIsDeep), de sorte que si exemple 1 ajouté serrure alors exemple 2 verrouillage ajouté et instance1 essayé d'enregistrer alors vous obtenez l'article périmé, parce que instance 2 modifié le nœud en y ajoutant un verrou ... alors comment pourrais-je empêcher cela?

Un grand merci pour votre soutien!

Répondre

0

je en quelque sorte trouvé ce sujet et ai vérifié votre code, que pensez-vous de mal ici est que vous obtenez une séance basée verrouiller donc vos dépôts en cluster n'a pas idée de la serrure car elle n'est pas appliquée au nœud en cluster.

Qu'est-ce que vous auriez dû faire à la place est de faire ce qui suit:

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

Plus d'informations peuvent être trouvées à l'adresse: https://wiki.apache.org/jackrabbit/Clustering#Concurrent_Write_Behavior Surtout dans la colonne des limites.

0

Peut-être que vous pouvez essayer avec node.refresh(false) pour forcer le nœud à rafraîchir son cache et obtenir de nouvelles modifications

+0

Quand effectueriez-vous l'actualisation? juste avant de sauvegarder ou avant le verrouillage? également dans la documentation [ici] (https://docs.adobe.com/content/docs/fr/spec/jsr170/javadocs/jcr-2.0/javax/jcr/Item.html#refresh (booléen)), il est dit que tous les modifications seront effacées pour la session en cours si refresh (false) est appliqué. Mais je pense que mon problème est lié aux changements appliqués par d'autres sessions? – zalis

+0

Avant la sauvegarde. Si le noeud est déjà modifié, il sera de toute façon inutilisable. Mais vous avez peut-être raison, j'avais mal compris le fait que l'actualisation ne fait que "réinitialiser" toutes les modifications en attente dans la session en cours. Je n'ai jamais utilisé Jackrabbit sur un environnement en cluster pour être honnête – Nico