Class | Rinda::RingServer
In: | rinda/ring.rb
Parent: | Object

A RingServer allows a Rinda::TupleSpace to be located via UDP broadcasts. Service location uses the following steps:

1. A RingServer begins listening on the broadcast UDP address.
2. A RingFinger sends a UDP packet containing the DRb URI where it will listen for a reply.
3. The RingServer recieves the UDP packet and connects back to the provided DRb URI with the DRb service.

### Methods

do_reply do_write new reply_service write_service

### Included Modules

DRbUndumped

### Public Class methods

new(ts, port=Ring_PORT)

Advertises `ts` on the UDP broadcast address at `port`.

[Source]

    # File rinda/ring.rb, line 32
        def initialize(ts, port=Ring_PORT)
          @ts = ts
          @soc = UDPSocket.open
          @soc.bind('', port)
          @w_service = write_service
          @r_service = reply_service
        end

### Public Instance methods

do_reply()

Pulls lookup tuples out of the TupleSpace and sends their DRb object the address of the local TupleSpace.

[Source]

    # File rinda/ring.rb, line 82
        def do_reply
          tuple = @ts.take([:lookup_ring, DRbObject])
          Thread.new { tuple[1].call(@ts) rescue nil}
        rescue
        end

do_write(msg)

Extracts the response URI from `msg` and adds it to TupleSpace where it will be picked up by `reply_service` for notification.

[Source]

    # File rinda/ring.rb, line 57
        def do_write(msg)
          Thread.new do
            begin
              tuple, sec = Marshal.load(msg)
              @ts.write(tuple, sec)
            rescue
            end
          end
        end

reply_service()

Creates a thread that notifies waiting clients from the TupleSpace.

[Source]

    # File rinda/ring.rb, line 70
        def reply_service
          Thread.new do
            loop do
              do_reply
            end
          end
        end

write_service()

Creates a thread that picks up UDP packets and passes them to do_write for decoding.

[Source]

    # File rinda/ring.rb, line 44
        def write_service
          Thread.new do
            loop do
              msg = @soc.recv(1024)
              do_write(msg)
            end
          end
        end

[Validate]