Spec-Zone.ru › Ruby 2.6

class Rinda::RingFinger

Parent:
Объект

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

На данный момент нет простого способа получить индекс интерфейса по имени.

Атрибуты

broadcast_list[RW]

Список адресов, куда RingFinger будет отправлять пакеты запросов.

multicast_hops[RW]

Максимальное количество переходов для отправленных пакетов мультикаста (если в списке трансляции используется адрес мультикаста). По умолчанию 1 (то же, что UDP трансляция).

multicast_interface[RW]

Индекс интерфейса для отправки пакетов IPv6 мультикаста.

port[RW]

Порт, на который RingFinger будет отправлять пакеты запросов.

primary[RW]

Содержит первый объявленный TupleSpace после вызова lookup_ring_any.

Публичные методы класса

finger() Показать исходный код
# 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.

new(broadcast_list=@@broadcast_list, port=Ring_PORT) Показать исходный код
# 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.

primary() Показать исходный код
# File lib/rinda/ring.rb, line 299
def self.primary
  finger.primary
end

Возвращает первый объявленный TupleSpace.

to_a() Показать исходный код
# File lib/rinda/ring.rb, line 306
def self.to_a
  finger.to_a
end

Содержит все обнаруженные TupleSpace, кроме основного.

Публичные методы экземпляра

each() { |primary| ... } Показать исходный код
# 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, начиная с основного.

lookup_ring(timeout=5, &block) Показать исходный код
# 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.

lookup_ring_any(timeout=5) Показать исходный код
# 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.

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.

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API