класс Rinda::RingFinger
RingFinger используется клиентами RingServer для обнаружения TupleSpace RingServer. Обычно клиенту достаточно вызвать ::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 287
def self.finger
unless @@finger
@@finger = self.new
@@finger.lookup_ring_any
end
@@finger
end Создаёт одиночный экземпляр RingFinger и ищет RingServer. Возвращает созданный RingFinger.
# File lib/rinda/ring.rb, line 343 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 298 def self.primary finger.primary end
Возвращает первый объявленный TupleSpace.
# File lib/rinda/ring.rb, line 305 def self.to_a finger.to_a end
Содержит все обнаруженные TupleSpaces, кроме основного.
Публичные Экземплярные Методы
# File lib/rinda/ring.rb, line 363
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 375
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 389
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 356 def to_a @rings end
Содержит все обнаруженные TupleSpaces, кроме основного.
Ruby Core © 1993–2017 Yukihiro Matsumoto
Licensed under the Ruby License.
Ruby Standard Library © contributors
Licensed under their own licenses.