類別 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 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 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 lib/rinda/ring.rb, line 299
def self.primary
  finger.primary
end
to_a() 按一下以切換來源

包含所有已發現的 TupleSpace,但主 TupleSpace 除外。

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

公開實例方法

each() { |primary| ... } 按一下以切換來源

從主 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
lookup_ring(timeout=5, &block) 按一下以切換來源

查詢 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
lookup_ring_any(timeout=5) 按一下以切換來源

傳回第一個找到的遠端 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
to_a() 按一下以切換來源

包含所有已發現的 TupleSpace,但主 TupleSpace 除外。

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