はまりどころ
- get("/path", watch: true)を何回登録しても一回だけコールバックされる。(ソースコメントより)
- Watcherのcallback内は、例外がつぶされる。
- createするときに間のpathが無いとProcessがとまる。。
create
zk.create("/test", "abc")
# 2番目の要素はznodeの状態
zk.get("/test") #=> ["abc", #<Zookeeper::Stat>]
オプション
ignore
# 既にノードがあってもエラーにならない
zk.create("/test", ignore: :node_exists)
# 途中のノードが無くてもエラーにならない
zk.create("/test/abc", ignore: :no_node)
ephemeral
# Ephemeralノードとして作成する
zk.create('/ephe', ephemeral: true)
or
# :setと渡すと途中のpashを生成してくれる。
# sequentialとehemeralがだめ?(ソースのコメントより)
zk.create('/foo/bar/text', or: :set) #=> /foo/bar が無くても作られる。
Stat
znodeの値とステータスを取得する
# 配列で [value, stat] と返される
value, stat = zk.get("/path")
# Ephemerarlかどうか?
stat.ephemeral?
Locker
Lockには以下の二つのtypeがある
default znodeをきめれる
default znodeを変更する
ZK::Locker.default_root_lock_node = "/abc"
exclusives_locker
普通のロック
使い方
# 注) ロックをとったインスタンスでしかunlockできない
locker = zk.locker('hoge')
if locker.lock
# do something
locker.unlock
end
shared_locker
よくわからない
eventでとれる情報
zk.register(path) do |event|
# watch対象のnodeが作られた?
event.node_created?
# watch対象のnodeに変更?
event.node_changed?
end
find
指定したノードに対し逐次実行していく。
zk.find("/root") do |path|
p path # ここで処理を実行していく
# abc以下はトラバースしない。
ZK::Find.prune if path == "/root/abc"
end
子ノードの変更を常に監視する。
※ event => 再度event登録までのeventは拾えない
zk = ZK.new
# 子ノードに追加・削除があったときに実行されるブロックを登録
zk.register("/test1") do |event|
p event
# 一度よばれると、Watcherの登録が消されるので再度登録
zk.children("/test1", watch: true)
end
# watch開始
zk.children("/test1", watch: true)