Je suis relativement nouveau avec hiberner alors s'il vous plaît soyez doux. Je rencontre un problème avec une méthode longue durée (~ 2 min de long) et la modification de la valeur d'un champ d'état sur un objet stocké dans la base de données. Le pseudo-code ci-dessous devrait aider à expliquer mon problème.Longue méthode de fonctionnement causant l'état de la course
public foo(thing) {
if (thing.getStatus() == "ready") {
thing.setStatus("finished");
doSomethingAndTakeALongTime();
} else {
// Thing already has a status of finished. Send the user back a message.
}
}
Le pseudo-code ne devrait pas prendre beaucoup d'explications. Je veux que doSomethingAndTakeALongTime() s'exécute, mais seulement s'il a un statut "prêt". Mon problème se pose chaque fois que cela prend 2 minutes pour que doSomethingAndTakeALongTime() se termine et que la modification du champ d'état de l'objet ne soit pas conservée dans la base de données tant qu'elle n'a pas quitté foo(). Ainsi, un autre utilisateur peut faire une demande pendant ces 2 minutes et l'instruction if sera évaluée à true.
J'ai déjà essayé de mettre à jour le champ et le rinçage de la session manuellement, mais il ne semble pas fonctionner. Je ne sais pas quoi faire d'ici et j'apprécierais toute aide.
PS: Ma session de mise en veille prolongée est géré par ressort.
Pour éviter les failles rouges: vous savez que vous devez comparer les chaînes en utilisant 'equals()'? – BalusC
Votre méthode est-elle dans un contexte de transaction, par ex. printemps des transactions déclaratives? Si c'est le cas, le rinçage n'aidera pas puisque les autres utilisateurs ne verront pas la modification. – mdma
@BalusC, oui j'en suis conscient. Mon code réel n'utilise pas de chaîne; Je viens de créer cet exemple, et incorrectement, pour votre plus grand plaisir. :) – keeleyt83