class Myxi::Server
Attributes
options[R]
selector[R]
sessions[R]
timers[R]
Public Class Methods
new(options = {})
click to toggle source
# File lib/myxi/server.rb, line 9 def initialize(options = {}) @options = options @selector = NIO::Selector.new @timers = Timers::Group.new @sessions = [] end
Public Instance Methods
run()
click to toggle source
# File lib/myxi/server.rb, line 20 def run Myxi::Exchange.declare_all @listener = Listener.new(self, options) unless options[:touch_interval] == 0 @timers.every(options[:touch_interval] || 60) do @sessions.each(&:touch) end end Signal.trap("TERM") do if @options[:shutdown_time] @timers.after(0) do Myxi.logger.info("Received TERM signal, beginning #{@options[:shutdown_time]} second shutdown.") @listener.close end @timers.every(1) do @shutdown_timer ||= 0 @sessions.each do |session| if session.hash % @options[:shutdown_time] == @shutdown_timer % @options[:shutdown_time] session.close end end @shutdown_timer += 1 if @sessions.size == 0 Myxi.logger.info("All clients disconnected. Shutdown complete.") Process.exit(0) end end wakeup else @timers.after(0) do Myxi.logger.info("Received TERM signal, shutting down immediately") Process.exit(0) end end end loop do wi = @timers.wait_interval if wi > 0 wait_interval = wi else wait_interval = 0 end selector.select(wait_interval) do |monitor| begin monitor.value.handle_r if monitor.readable? monitor.value.handle_w if monitor.writeable? rescue => e # Try to recover wherever possible if monitor && monitor.value if monitor.value == @listener raise else monitor.value.close rescue nil end else raise end begin Myxi.logger.info(e.class.to_s + ' ' + e.message.to_s) e.backtrace.each do |line| Myxi.logger.info(' ' + line) end rescue end end end @timers.fire end end
wakeup()
click to toggle source
# File lib/myxi/server.rb, line 16 def wakeup @selector.wakeup end