class DCell::Server
Servers handle incoming 0MQ traffic
Public Class Methods
new()
click to toggle source
Bind to the given 0MQ address (in URL form ala tcp://host:port)
# File lib/dcell/server.rb, line 9 def initialize # The gossip protocol is dependent on the node manager link Celluloid::Actor[:node_manager] @socket = PullSocket.new begin @socket.bind(DCell.addr) real_addr = @socket.get(::ZMQ::LAST_ENDPOINT).strip DCell::Directory.set DCell.id, real_addr DCell.addr = real_addr rescue IOError @socket.close raise end async.run end
Public Instance Methods
close()
click to toggle source
# File lib/dcell/server.rb, line 33 def close @socket.close if @socket end
decode_message(message)
click to toggle source
Decode incoming messages
# File lib/dcell/server.rb, line 56 def decode_message(message) if message[0..1].unpack("CC") == [Marshal::MAJOR_VERSION, Marshal::MINOR_VERSION] begin Marshal.load message rescue => ex raise InvalidMessageError, "invalid message: #{ex}" end else raise InvalidMessageError, "couldn't determine message format: #{message}" end end
handle_message(message)
click to toggle source
Handle incoming messages
# File lib/dcell/server.rb, line 38 def handle_message(message) begin message = decode_message message rescue InvalidMessageError => ex Logger.crash("couldn't decode message", ex) return end begin message.dispatch rescue => ex Logger.crash("DCell::Server: message dispatch failed", ex) end end
run()
click to toggle source
Wait for incoming 0MQ messages
# File lib/dcell/server.rb, line 29 def run while true; async.handle_message @socket.read; end end
terminate()
click to toggle source
Terminate this server
Calls superclass method
# File lib/dcell/server.rb, line 68 def terminate @socket.close super end