2012-07-10 118 views
3

是否可以通過Zookeeper CLI讀取其中有空格的znode?Zookeeper CLI - 用空格讀取Znode

我有2個值下的區域(「美西1」和「美東」)

[zk: localhost:2181(CONNECTED) 11] get /regions/ 
us-west 1 us-east 

我可以讀「美東」。

[zk: localhost:2181(CONNECTED) 11] get /regions/us-east 
null 
cZxid = 0xa 
ctime = Tue Jul 10 12:41:49 IST 2012 
mZxid = 0xa 
mtime = Tue Jul 10 12:41:49 IST 2012 
pZxid = 0x1b 
cversion = 9 
dataVersion = 0 
aclVersion = 0 
ephemeralOwner = 0x0 
dataLength = 0 
numChildren = 9 

但不是 '美西1'

[zk: localhost:2181(CONNECTED) 11] get /regions/us-west 1 
Node does not exist: /regions/us-west 

我嘗試選項,如 '%20', '\', '+' 等。對空間,但毫無效果。

回答

3

看起來你不能從ZK命令行客戶端那樣做。 Zookeeper Java客戶端(可能是您正在使用的那個客戶端)通過解析空白字符從它們的參數中分離出命令(例如/regions/us-west 1)(如您的案例中的/regions/us-west 1),您可以在客戶端提供的代碼中看到(例如zookeeper -3.3.5的\ src \ java的\主\組織\阿帕奇\飼養員\ ZooKeeperMain.java):

public boolean parseCommand(String cmdstring) { 
    String[] args = cmdstring.split(" "); 
    if (args.length == 0){ 
     return false; 
    } 
    command = args[0]; 
    cmdArgs = Arrays.asList(args); 
    return true; 
} 

因爲它們是由一個 「」 分裂,除非你想出一個辦法來克服split調用一些在調用get命令時會發生一些轉義,您將無法使用此客戶端檢索這些節點。上面的代碼解釋你1get電話就好像它是在watch參數,你可以在get命令語法看到:

獲取路徑[表]

我建議你使用一個不同的字符,例如'_',而不是znodes命名空白。如果這不是一個選項,您將需要自己修改ZK Java客戶端,或使用其他客戶端。

5

請嘗試zookeepercli,如下:

$ zookeepercli --servers srv1,srv2,srv3 -c create "/demo_only 1" "the value" 
$ zookeepercli --servers srv1,srv2,srv3 -c get "/demo_only 1" 
the value 

zookeepercli是自由和開放源碼。 免責聲明:我是這個工具的作者。