class 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 Итерируется по всем обнаруженным 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 Ищет 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–2017 Yukihiro Matsumoto
Licensed under the Ruby License.
Ruby Standard Library © contributors
Licensed under their own licenses.