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 .
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