[JCMS 7.1.2] Problème de déverrouillage de documents avec un verrou fort sur documents

Yvan Janet · le 07/01/14 à 17:33

Bonjour.

Au cours de différents tests unitaires, j'effectue différents verrouillages de publications de type FileDocument à l'aide des méthodes lock(Member) et putStrongLock(Member).

Si mon verrou est faible, la méthode unlock() parvient à retirer le verrou et je peux continuer mes tests.

Si mon verrou est fort, la méthode releaseStrongLock() ne semble pas retirer le verrou et la suite de mon test est condamnée à l'oubli.

Je travaille sur un FileDocument créé dans la méthode setUp(), je lui applique un certain nombre de traitements qui fonctionnent bien pour l'ensemble des autres tests.

doc1 = new FileDocument();
doc1.setTitle(DOC_TITLE);
doc1.setFileName(DOC_FILENAME);
...
doc1.performCreate();
deleteOnTearDown(doc1);

Le test que j'effectue qui ne me rend pas la main sur le doc est

doc1.putStrongLock(admin);
assert ...
doc1.releaseStrongLock();
assertFalse("Le déverrouillage n'a pas été effectué correctement",doc.isStrongLocked());

Existe-t-il des limites à l'utilisation des strongLocks ?

 

13 pts
Olivier Jaquemet - le 07/01/14 à 17:41
Meilleure réponse

Bonjour Yvan,

Je n'ai pas vérifié, mais pour vous répondre rapidement, la problème est très probablement lié à l'utilisation d'une seule et même transaction hibernate pour les 2 opérations (ajout du lock et supression).

Solution : fermer et réouvrir la session entre les actions.

 // Lock
beginTransaction();
{
doc.putStrongLock(ws1Writer);
}
commitTransaction();


// Test after lock
beginTransaction();
{
   assertEquals(ws1Writer, doc.getStrongLockMember());
}
commitTransaction();


// Unlock
beginTransaction();
{
doc.releaseStrongLock(ws1Writer);
}
commitTransaction(); 
9 pts
Yvan Janet · le 08/01/14 à 10:02

Merci,

Je n'avais pas vu que les verrous forts étaient dans la database...

Je peux donc déduire que les verrous fort sont stockés dans la table j_stronglock que je peux (techniquement parlant, je ne parle pas d'utiliser la fonction dans le cadre de l'utilisation normale de la plate-forme) vider pour forcer à relâcher tous les verrous (par exemple suite à un changement de structure de données ajoutant des attributs obligatoires à des publications, je ne peux plus relâcher les verrous forts ni depuis le back, ni le front office)

#1

Si tu passes par les API hibernates, oui, ça serait envisageable... mais comme JCMS est susceptible de conserver des caches, je ne te le recommande pas.

L'approche par fermeture/réouverture de session est la meilleure solution, nous l'utilisons fréquement dans nos tests unitaires.

Olivier Jaquemet · le 08/01/14 à 10:07
#2

Je pensais le faire avec les instances JCMS coupées, directement dans la BD dans un processus de livraison de mises à jour structurelles.

Yvan Janet · le 08/01/14 à 10:19
#3

ah, ok. dans ce cas, oui ça doit être possible.

Olivier Jaquemet · le 08/01/14 à 10:25
1 pt