Skip to content

Instantly share code, notes, and snippets.

@eric
Created April 2, 2012 04:23
Show Gist options
  • Save eric/2280712 to your computer and use it in GitHub Desktop.
Save eric/2280712 to your computer and use it in GitHub Desktop.
module Papertrail
module Zookeeper
class NodeWatcher
include Watchable
attr_reader :name
def initialize(zk, name, options = {})
@zk = zk
@name = name
@mutex = Mutex.new
register
end
def register
@zk.register(@name) do |event|
@mutex.synchronize do
Rails.logger.info "node_watcher: event received: #{event.inspect}"
if event.node_created?
handle_data(:created)
elsif event.node_changed?
handle_data(:changed)
elsif event.node_deleted?
handle_deleted
else
Rails.logger.info "node_watcher: Unknown event: #{event.inspect}"
end
end
end
@zk.on_connected do
@zk.stat(@name, :watch => true)
end
@zk.stat(@name, :watch => true)
end
def handle_deleted
# Re-register events
@zk.stat(@name, :watch => true)
fire(:deleted)
end
def handle_data(action)
# Re-register events
value, _ = @zk.get(@name, :watch => true)
fire(action, value)
rescue ZK::Exceptions::NoNode
handle_deleted
end
end
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment