Spec-Zone.ru › Ruby 2.2

класс 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

В настоящее время нет простого способа получить индекс интерфейса по имени.

Атрибуты

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 284
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 340
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 295
def self.primary
  finger.primary
end

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

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

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

Методы экземпляра

each() { |primary| ... } Показать исходный код
# File lib/rinda/ring.rb, line 360
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 372
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 386
def lookup_ring_any(timeout=5)
  queue = 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. Любые другие найденные TupleSpace можно найти, вызвав to_a.

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

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

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