класс 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–2022 Yukihiro Matsumoto
Licensed under the Ruby License.
Ruby Standard Library © contributors
Licensed under their own licenses.