class RackRabbit::Worker

Attributes

config[R]
handler[R]
lock[R]
logger[R]
rabbit[R]
signals[R]
subscriber[R]

Public Class Methods

new(config, app) click to toggle source
# File lib/rack-rabbit/worker.rb, line 21
def initialize(config, app)
  @config     = config
  @logger     = config.logger
  @signals    = Signals.new
  @lock       = Mutex.new
  @rabbit     = Adapter.load(config.rabbit)
  @handler    = Handler.new(app, config)
  @subscriber = Subscriber.new(rabbit, handler, lock, config)
end

Public Instance Methods

run() click to toggle source
# File lib/rack-rabbit/worker.rb, line 33
def run

  logger.info "STARTED a new worker with PID #{Process.pid}"

  trap_signals

  subscriber.subscribe

  while true
    sig = signals.pop   # BLOCKS until there is a signal
    case sig
    when :INT  then shutdown(:INT)
    when :QUIT then shutdown(:QUIT)
    when :TERM then shutdown(:TERM)
    else
      raise RuntimeError, "unknown signal #{sig}"
    end
  end

ensure
  subscriber.unsubscribe

end
shutdown(sig) click to toggle source
# File lib/rack-rabbit/worker.rb, line 59
def shutdown(sig)
  lock.lock if sig == :QUIT # graceful shutdown should wait for any pending message handler to finish
  logger.info "#{RackRabbit.friendly_signal(sig)} worker #{Process.pid}"
  exit
end
trap_signals() click to toggle source
# File lib/rack-rabbit/worker.rb, line 67
def trap_signals  # overwrite the handlers inherited from the server process

  [:QUIT, :TERM, :INT].each do |sig|
    trap(sig) do
      signals.push(sig)
    end
  end

  trap(:CHLD, :DEFAULT)
  trap(:TTIN, nil)
  trap(:TTOU, nil)

end