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!
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
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