# File lib/rinda/ring.rb, line 299 def self.primary finger.primary end
類別 Rinda::RingFinger
RingFinger
由 RingServer
客戶端用於發現 RingServer 的 TupleSpace
。通常,客戶端只需要呼叫 RingFinger.primary
來擷取遠端的 TupleSpace
,然後就可以開始使用它。
尋找第一個可用的遠端 TupleSpace
Rinda::RingFinger.primary
建立一個廣播至自訂清單的 RingFinger
rf = Rinda::RingFinger.new ['localhost', '192.0.2.1'] rf.primary
Rinda::RingFinger
也了解多播位址,並適當地設定它們。這允許您在同一主機上執行多個 RingServer
rf = Rinda::RingFinger.new ['239.0.0.1'] rf.primary
您可以使用 multicast_hops
設定多播搜尋的跳躍次數(或 TTL)。
如果您使用 IPv6 多播,可能需要設定位址和傳送介面索引
rf = Rinda::RingFinger.new ['ff02::1'] rf.multicast_interface = 1 rf.primary
目前沒有簡單的方法可以透過名稱取得介面索引。
屬性
RingFinger
將傳送查詢封包的位址清單。
傳送多播封包的最大跳躍次數(如果在廣播清單中使用多播位址)。預設值為 1(與 UDP 廣播相同)。
傳送 IPv6 多播封包的介面索引。
RingFinger
將傳送查詢封包的埠。
呼叫 lookup_ring_any
之後,包含第一個宣告的 TupleSpace
。
公開類別方法
建立單例 RingFinger
並尋找 RingServer
。傳回已建立的 RingFinger
。
# File lib/rinda/ring.rb, line 288 def self.finger unless @@finger @@finger = self.new @@finger.lookup_ring_any end @@finger end
建立新的 RingFinger
,它會在 broadcast_list
中的位址上,於 port
尋找 RingServer。
如果 broadcast_list
包含多播位址,則會使用指定的 multicast_hops
和 multicast_interface 進行多播查詢。
# File lib/rinda/ring.rb, line 344 def initialize(broadcast_list=@@broadcast_list, port=Ring_PORT) @broadcast_list = broadcast_list || ['localhost'] @port = port @primary = nil @rings = [] @multicast_hops = 1 @multicast_interface = 0 end
傳回第一個宣傳的 TupleSpace
。
包含所有已發現的 TupleSpace,但主 TupleSpace 除外。
# File lib/rinda/ring.rb, line 306 def self.to_a finger.to_a end
公開實例方法
從主 TupleSpace 開始,反覆處理所有已發現的 TupleSpace。
# File lib/rinda/ring.rb, line 364 def each lookup_ring_any unless @primary return unless @primary yield(@primary) @rings.each { |x| yield(x) } end
查詢 RingServer,等待 timeout
秒。RingServer 會將 block
作為回呼,並會呼叫遠端 TupleSpace
。
# File lib/rinda/ring.rb, line 376 def lookup_ring(timeout=5, &block) return lookup_ring_any(timeout) unless block_given? msg = Marshal.dump([[:lookup_ring, DRbObject.new(block)], timeout]) @broadcast_list.each do |it| send_message(it, msg) end sleep(timeout) end
傳回第一個找到的遠端 TupleSpace
。可透過呼叫 to_a
找到任何進一步復原的 TupleSpace。
# File lib/rinda/ring.rb, line 390 def lookup_ring_any(timeout=5) queue = Thread::Queue.new Thread.new do self.lookup_ring(timeout) do |ts| queue.push(ts) end queue.push(nil) end @primary = queue.pop raise('RingNotFound') if @primary.nil? Thread.new do while it = queue.pop @rings.push(it) end end @primary end
包含所有已發現的 TupleSpace,但主 TupleSpace 除外。
# File lib/rinda/ring.rb, line 357 def to_a @rings end