класс Rinda::RingFinger
RingFinger используется клиентами RingServer для обнаружения TupleSpace RingServer. Как правило, клиенту нужно только вызвать 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
Вы можете установить количество переходов (или TTL) для запросов мультикаста, используя multicast_hops.
Если вы используете IPv6 мультикаст, вам может потребоваться установить как адрес, так и индекс интерфейса отправки:
rf = Rinda::RingFinger.new ['ff02::1'] rf.multicast_interface = 1 rf.primary
В настоящее время нет простого способа получить индекс интерфейса по имени.
Атрибуты
Список адресов, куда RingFinger будет отправлять пакеты запросов.
Максимальное количество переходов для отправленных пакетов мультикаста (если в списке трансляции указан адрес мультикаста). По умолчанию значение равно 1 (то же, что и UDP-трансляция).
Индекс интерфейса для отправки пакетов IPv6 мультикаста.
Порт, на который RingFinger будет отправлять пакеты запросов.
Содержит первый объявленный TupleSpace после вызова lookup_ring_any.
Публичные методы класса
# File lib/rinda/ring.rb, line 288
def self.finger
unless @@finger
@@finger = self.new
@@finger.lookup_ring_any
end
@@finger
end Создаёт одиночный экземпляр RingFinger и ищет RingServer. Возвращает созданный RingFinger.
# 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
Создаёт новый RingFinger, который будет искать RingServer по port на адресах в broadcast_list.
Если broadcast_list содержит адрес мультикаста, то запросы мультикаста будут отправляться с использованием заданного multicast_hops и multicast_interface.
# File lib/rinda/ring.rb, line 299 def self.primary finger.primary end
Возвращает первый объявленный TupleSpace.
# File lib/rinda/ring.rb, line 306 def self.to_a finger.to_a end
Содержит все обнаруженные 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 Итерирует по всем обнаруженным TupleSpaces, начиная с основного.
# 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 Ищет RingServer, ожидая timeout секунд. RingServer будет передан block как обратный вызов, который будет вызван с удалённым 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 Возвращает первый найденный удалённый TupleSpace. Любые другие полученные TupleSpaces можно найти, вызвав to_a.
# File lib/rinda/ring.rb, line 357 def to_a @rings end
Содержит все обнаруженные TupleSpaces, кроме основного.
Ruby Core © 1993–2022 Yukihiro Matsumoto
Licensed under the Ruby License.
Ruby Standard Library © contributors
Licensed under their own licenses.