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