2017-06-02 1 views
0

CAS D'UTILISATION: Créer une séquence atomique en utilisant le dernier identifiant sauvegardé dans la base de données (pas à partir de zéro) et générer l'identifiant après le dernier identifiant enregistré dans db. Nous vérifions d'abord si l'instance AtomicSequence est présente ou non, sinon nous créons AtomicSequence à partir du dernier identifiant enregistré (si l'entrée est en db.).Séquence atomique utilisant Hazelcast

Dans HazelcastAtomicSequenceManager, la méthode getSequenceGenerator est un processus en deux étapes.

Étape 1: getHzInstance(). GetAtomicLong (clé). // Il obtiendra s'il n'est pas présent créer un nouveau avec 0 valeur initiale. Étape 2: this.sequence.compareAndSet (0, startVal); // définit la valeur si la valeur initiale est zéro. Maintenant, considérons Thread 1 venez vérifier et voir AtomicSequence pour la clé donnée n'est pas présent et exécuter stpe1 n'a toujours pas exécuté l'étape 2. Thread 2 venir et voir AtomicSequence est créé (Comme l'étape 1 est exécutée par thread1) et aller de l'avant et l'incrémenter à 1. Comme la valeur initiale encore zéro comme thread 2 n'a pas exécuté l'étape 2. Maintenant thread 1 va essayer d'exécuter l'étape 2 mais incapable de le faire que la valeur initiale est devenue 1 ou quelque chose de différent de zéro. Ainsi, la séquence atomique va générer un identifiant à partir de 1, au lieu de cela, il devrait commencer à partir du dernier identifiant de sauvegarde, en raison duquel notre cas de test échoue. un moyen de résoudre ce problème

Répondre

-1

Vous devez obtenir et essayer compareAndSet dans une boucle, jusqu'à ce qu'elle réussisse:

 long current; 
 
     do { 
 
      current = atomicLong.get(); 
 
     } while (!atomicLong.compareAndSet(current, startVal));

+0

Je pense que le problème est la séquence atomique devrait commencer à partir de dernier enregistré id.If thread avec zéro start valeur qui va initialiser à 1. Je pense qu'il devrait soutenir public IAtomicLong getAtomicLong (nom de la chaîne, initVal long, booléen créer) –

+0

Je comprends votre besoin. Voulez-vous dire IAtomicLong getAtomicLong (String name, long initVal). Oui, il peut être discuté si l'API peut être étendue pour fournir une valeur initiale. Vous pouvez ouvrir un problème pour cela au repo de github. –

+0

J'ai déjà créé un numéro.Veuillez trouver le lien ci-dessous https://github.com/hazelcast/hazelcast/issues/10696 –