Ein Fehler im ZooKeeper-3.4.10-Quellcode: Daten dürfen beim Erstellen temporärer Knoten nicht leer sein

Bei der Verwendung der ZooKeeper-API zum Erstellen eines temporären Knotens habe ich mehrmals erfolglos versucht,
zkClient.createEphemeral (currentServiceIpNode)

Verwenden Sie also /zookeeper-3.4.10/bin/zkCli.sh, um die Befehlszeile auszuführen und zu versuchen, einen temporären Knoten zu erstellen

[zk: localhost:2181(CONNECTED) 2] create -e /zk_demo/tempData
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3
	at org.apache.zookeeper.ZooKeeperMain.processZKCmd(ZooKeeperMain.java:706)
	at org.apache.zookeeper.ZooKeeperMain.processCmd(ZooKeeperMain.java:599)
	at org.apache.zookeeper.ZooKeeperMain.executeLine(ZooKeeperMain.java:371)
	at org.apache.zookeeper.ZooKeeperMain.run(ZooKeeperMain.java:331)
	at org.apache.zookeeper.ZooKeeperMain.main(ZooKeeperMain.java:290)

ZooKeeperMain.java 报错 ArrayIndexOutOfBoundsException

Laden Sie also den Quellcode von zookeeper-3.4.10 herunter. Gemäß der gedruckten Stapelinformationsverfolgung wird festgestellt, dass tatsächlich ein Fehler bei der Verarbeitung des Befehls create im Quellcode vorliegt. Der Quellcode geht davon aus, dass create -e beim Erstellen eines temporären Knotens vier Eingabeparameter sein muss. Wenn die Daten des temporären Knotens nicht eingegeben werden, sind die Eingabeparameter nur 3 args [0] = "create" args [1] = "-e" args [2] = "/ zk_demo / tempData" args [3] überschreiten die Grenze .
Fügen Sie hier eine Bildbeschreibung ein

Also habe ich versucht, die temporären Knotendaten zum Zeitpunkt der Erstellung zu schreiben: Sicher genug, es war erfolgreich.

[zk: localhost:2181(CONNECTED) 0] create -e /zk_demo/tempData tempdata
Created /zk_demo/tempData
[zk: localhost:2181(CONNECTED) 1] ls /zk_demo/tempData
[]
[zk: localhost:2181(CONNECTED) 2] get /zk_demo/tempData
tempdata
cZxid = 0x79d4
ctime = Mon Jan 07 21:37:06 CST 2019

Dann ging ich zur offiziellen Website von Apache ZooKeeper und stellte fest, dass jemand diesen Fehler vor langer Zeit ausgegeben hatte:
https://issues.apache.org/jira/browse/ZOOKEEPER-1220
und der offizielle Fehlerbehebung in ZooKeeper-3.5.0

Mit anderen Worten, Sie müssen ZooKeeper auf über 3.5.0 aktualisieren.
ZooKeeper ist jedoch der öffentliche Basisdienst des Unternehmens. Die Version wird von den Betriebs- und Wartungsstudenten verwaltet. Die Entwicklung kann nicht aktualisiert werden.

Temporäre Lösung:
Ersetzen Sie
public void createEphemeral (endgültiger String-Pfad) durch public void createEphemeral (endgültiger String-Pfad, endgültige Objektdaten) und schreiben Sie temporäre Daten beiläufig.

      if(!exist) {
                    //注意,这里创建的是临时节点
                    //zkClient.createEphemeral(currentServiceIpNode);//zookeeper-3.4.10 以及以下版本 创建临时节点时必须写入数据, 否则无法创建成功
                    zkClient.createEphemeral(currentServiceIpNode, "Just Need Some Data");
                }

Dadurch wird der temporäre Knoten erfolgreich erstellt

Veröffentlicht 557 Originalartikel · Gelobt 4286 · 2,89 Millionen Aufrufe

Ich denke du magst

Origin blog.csdn.net/dataiyangu/article/details/105461529
Empfohlen
Rangfolge