2016-06-09 38 views
1

我使用這個寶石:https://github.com/zk-ruby/zk連接到動物園管理員,和getset命令工作正常。紅寶石動物園看守人

我已經嘗試添加一個使用示例zookeeper客戶端與服務器構建一起來的觀察器客戶端,並且所有工作都很好。我可以添加一個觀察器,當我從另一個客戶端更新某個znode時,客戶端會收到通知。

但我希望集成一個觀察者在Ruby代碼中,當節點上的數據發生更改時,我沒有收到任何事件。

這是一個示例類:

class ZkConnect 

    attr_accessor :z, :sub, :k 
    include Singleton 

    @z = nil 
    @sub = nil 
    @watcher = nil 
    @callback = nil 
    @watcher = nil 

    def initialize 
    initialize_conns 
    end 

    def initialize_conns 
    @z = ZK.new("localhost:2181") 
    Rails.logger.info @z.inspect 
    # Rails.logger.info z.get_children(:path => "/system/production") 
    # Rails.logger.info z.get(:path => "/system/production")[:data] 

    # @sub = @z.register("/mypath") do |event, zookeeper_client| 
    # Rails.logger.info "got an event" 
    # Rails.logger.info "got an event on: #{event.inspect} #{zookeeper_client.inspect}" 
    # end 
    # Rails.logger.info @sub.inspect 
    w = watch 
    Rails.logger.info "dsmcldsm: #{w.inspect}" 
    end 

    # def watcher_callback 
    # @callback ||= Proc.new do |event| 
    #  Rails.logger.info "dcbskcn : #{event.inspect}" 
    #  # Set new watcher 
    #  watch 
    #  # Rediscover 
    #  # discover 
    # end 
    # Rails.logger.info "nckdj cudsnciu sdcn: #{@callback.inspect}" 
    # return @callback 
    # end 

    def watch 
    # return if @z.nil? 
    Rails.logger.info "synapse: setting watch at " 

    # @watcher = @z.register("/mypath", &watcher_callback) 
    @watcher = @z.register("/mypath") do |event| 
     Rails.logger.info "dcbskcn : #{event.inspect}" 
     puts "dcbskcn : #{event.inspect}" 
     watch 
    end 
    Rails.logger.info "cudsnciu: #{@watcher.inspect}" 
    return @watcher 

    # Verify that we actually set up the watcher. 
    # unless @zk.exists?(@discovery['path'], :watch => true) 
    # log.error "synapse: zookeeper watcher path #{@discovery['path']} does not exist!" 
    # zk_cleanup 
    # end 
    # log.debug "synapse: set watch at #{@discovery['path']}" 
    end 
end 

我花了一些代碼從這裏https://github.com/airbnb/synapse/blob/master/lib/synapse/service_watcher/zookeeper.rb這一點,但並沒有幫助。

我試過它在rails項目上,試過在thinpassenger上運行,雖然我看不出它會有什麼幫助。

我也沒有看到eventmachine作爲這個寶石的依賴,所以我真的不知道如何收到回調。

回答

1

我讀取changelog並決定在註冊觀察者後輸入@z.stat("/mypath", :watch => true)。它開始工作。不知道爲什麼。

+0

https://github.com/zk-ruby/zk/blob/5854b33ac0d584dacba03a63a5db917620d92a00/docs/examples/events_01.rb 這也表明類似的東西。 – neeraj

+0

它必須做w /動物園管理員客戶端協議。爲了從服務器接收監視通知,您必須向服務器發送包含要觀看路徑的路徑的命令。我想這是一個常見的用例來獲取或統計數學,並且如果它發生變化,您希望保持通知,所以請在同一時間設置一個手錶。它至少消除了一次到服務器的往返行程。 – Kevin