Ruby 2.4

Rinda::RingFinger

class Rinda::RingFinger

Parent:Object

RingFinger客户端使用RingFinger来发现RingServer的TupleSpace。通常,客户端需要做的就是调用:: 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_listRW

RingFinger将发送查询分组的地址列表。

multicast_hopsRW

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

multicast_interfaceRW

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

portRW

RingFinger将发送查询包的端口。

primaryRW

在#lookup_ring_any被调用后包含第一个广告的TupleSpace。

公共类方法

finger() Show source

创建一个单例RingFinger并查找RingServer。返回创建的RingFinger。

# File lib/rinda/ring.rb, line 284 def self.finger unless @@finger @@finger = self.new @@finger.lookup_ring_any end @@finger end

new(broadcast_list = @@ broadcast_list,port= Ring_PORT)显示源

创建一个新的RingFinger将寻找RingServers在port上的地址broadcast_list

如果broadcast_list包含多播地址,则将使用给定的#multicast_hops和multicast_interface进行多播查询。

# File lib/rinda/ring.rb, line 340 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 lib/rinda/ring.rb, line 295 def self.primary finger.primary end

to_a() 显示源

包含除主数据库外的所有发现的TupleSpaces。

# File lib/rinda/ring.rb, line 302 def self.to_a finger.to_a end

公共实例方法

each() { |primary| ... } 显示源

从主要开始迭代所有发现的TupleSpaces。

# File lib/rinda/ring.rb, line 360 def each lookup_ring_any unless @primary return unless @primary yield(@primary) @rings.each { |x| yield(x) } end

lookup_ring(timeout = 5,&block)显示源文件

查看RingServers等待timeout几秒钟。RingServers将block作为回调给出,将用远程TupleSpace调用。

# File lib/rinda/ring.rb, line 372 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) 显示源

返回找到的第一个远程元组空间。通过调用可以找到任何进一步恢复的TupleSpaces to_a

# File lib/rinda/ring.rb, line 386 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() 显示源

包含除主数据库外的所有发现的TupleSpaces。

# File lib/rinda/ring.rb, line 353 def to_a @rings end