class Rinda::RingFinger

RingFingerRingServer 客户端用来发现 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

目前没有简单的方法通过名称获取接口索引。

属性

broadcast_list[RW]

RingFinger 将向其发送查询数据包的地址列表。

multicast_hops[RW]

发送的多播数据包的最大跳数(如果在广播列表中使用多播地址)。默认值为 1(与 UDP 广播相同)。

multicast_interface[RW]

发送 IPv6 多播数据包的接口索引。

port[RW]

RingFinger 将向其发送查询数据包的端口。

primary[RW]

在调用 lookup_ring_any 后,包含第一个发布的 TupleSpace

公共类方法

finger() 单击以切换源代码

创建一个单例 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
new(broadcast_list=@@broadcast_list, port=Ring_PORT) 单击以切换源代码

创建一个新的 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
primary() 单击以切换源代码

返回第一个发布的 TupleSpace

# File rinda-0.2.0/lib/rinda/ring.rb, line 299
def self.primary
  finger.primary
end
to_a() 单击以切换源代码

包含除主 TupleSpace 之外的所有发现的 TupleSpace。

# File rinda-0.2.0/lib/rinda/ring.rb, line 306
def self.to_a
  finger.to_a
end

公共实例方法

each() { |primary| ... } 单击以切换源代码

迭代所有发现的 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
lookup_ring(timeout=5, &block) 单击以切换源代码

查找等待 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
lookup_ring_any(timeout=5) 单击以切换源代码

返回找到的第一个远程 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
to_a() 单击以切换源代码

包含除主 TupleSpace 之外的所有发现的 TupleSpace。

# File rinda-0.2.0/lib/rinda/ring.rb, line 357
def to_a
  @rings
end