2017-06-02 5 views
0

USE CASE: Erstellen AtomicSequence mit der zuletzt gespeicherten ID in der DB (nicht von Null beginnen) und generieren ID nach der letzten gespeicherten ID in db. Zuerst prüfen wir, ob die AtomicSequence-Instanz vorhanden ist oder nicht, wenn wir AtomicSequence nicht aus der letzten gespeicherten ID erstellen (wenn sich der Eintrag in db befindet).Atomare Sequenz mit Hazelcast

In HazelcastAtomicSequenceManager ist die getSequenceGenerator-Methode ein zweistufiger Prozess.

Schritt 1: getHzInstance(). GetAtomicLong (Schlüssel). // Es wird erhalten, wenn nicht vorhanden, erstellen Sie eine neue mit 0 Anfangswert. Schritt 2: this.sequence.compareAndSet (0, startVal); // Setze Wert, wenn der Initialwert Null ist.

Jetzt betrachten Thread 1 kommen überprüfen und sehen, dass die AtomicSequence für den angegebenen Schlüssel nicht vorhanden ist und führen Sie Stpe1 noch Schritt 2 nicht ausgeführt. Thread 2 kommen und sehen, die AtomicSequence erstellt wird (Wie Schritt 1 von thread1 ausgeführt wird) und gehen Sie weiter und erhöhen Sie es auf 1. Als der Anfangswert immer noch Null als Thread 2 führte Schritt 2 nicht aus. Jetzt wird Thread 1 versuchen, Schritt2 auszuführen, aber nicht zu ihm als Anfangswert wurde 1 oder etwas ungleich Null. Die Atomsequenz erzeugt also die ID von 1 als nächstes, statt dessen sollte sie von der letzten Speicher-ID beginnen, aufgrund deren unser Testfall fehlschlägt. Jede Art und Weise, dieses Problem zu beheben

Antwort

-1

Sie müssen compareAndSet in einer Schleife bekommen und versuchen, bis es erfolgreich ist:

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

+0

ich glaube, das Problem ist die Atom-Sequenz sollte von Anfang letzte gespeicherte ID.Wenn Thread mit Null Startwert Win, die auf 1. initialisiert wird. Ich denke, es sollte öffentliche IAtomicLong getAtomicLong unterstützen (String-Name, lange initVal, boolean create) –

+0

Ich verstehe Ihre Notwendigkeit. Meinst Du IAtomicLong getAtomicLong (String name, long initVal)? Ja, es kann diskutiert werden, ob die API um einen Anfangswert erweitert werden kann. Sie können ein Problem dafür im Github Repo öffnen. –

+0

Ich habe bereits ein Problem erstellt.Bitte finden Sie den Link unter https://github.com/hazelzweig/hazeltcast/issues/10696 –