class Rinda::RingServer
A RingServer allows a Rinda::TupleSpace to be located via UDP broadcasts. Service location uses the following steps:
-
A RingServer begins listening on the broadcast UDP address.
-
A RingFinger sends a UDP packet containing the DRb URI where it will listen for a reply.
-
The RingServer receives the UDP packet and connects back to the provided DRb URI with the DRb service.
Public Class Methods
Advertises ts
on the UDP broadcast address at
port
.
# File lib/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
Pulls lookup tuples out of the TupleSpace and sends their DRb object the address of the local TupleSpace.
# File lib/rinda/ring.rb, line 82 def do_reply tuple = @ts.take([:lookup_ring, DRbObject]) Thread.new { tuple[1].call(@ts) rescue nil} rescue end
Extracts the response URI from msg
and adds it to TupleSpace where it will be
picked up by reply_service
for notification.
# File lib/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
Creates a thread that notifies waiting clients from the TupleSpace.
# File lib/rinda/ring.rb, line 70 def reply_service Thread.new do loop do do_reply end end end
Creates a thread that picks up UDP packets and passes them to #do_write for decoding.
# File lib/rinda/ring.rb, line 44 def write_service Thread.new do loop do msg = @soc.recv(1024) do_write(msg) end end end