# File rinda-0.2.0/lib/rinda/ring.rb, line 299 def self.primary finger.primary end
class 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 rinda-0.2.0/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 rinda-0.2.0/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 rinda-0.2.0/lib/rinda/ring.rb, line 306 def self.to_a finger.to_a end
公共实例方法
迭代所有发现的 TupleSpace,从主 TupleSpace 开始。
# File rinda-0.2.0/lib/rinda/ring.rb, line 364 def each lookup_ring_any unless @primary return unless @primary yield(@primary) @rings.each { |x| yield(x) } end
查找等待 timeout
秒的 RingServer。RingServer 将获得 block
作为回调,该回调将使用远程 TupleSpace
调用。
# File rinda-0.2.0/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 rinda-0.2.0/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 rinda-0.2.0/lib/rinda/ring.rb, line 357 def to_a @rings end