class APN::SenderDaemon

A wrapper designed to daemonize an APN::Sender instance to keep in running in the background. Connects worker's output to a custom logger, if available. Creates a pid file suitable for monitoring with monit.

Based off delayed_job's great example, except we can be much lighter by not loading the entire Rails environment. To use in a Rails app, script/generate apn_sender.

Public Class Methods

new(args) click to toggle source
# File lib/apn/sender_daemon.rb, line 17
def initialize(args)
  @options = {worker_count: 1, delay: 5}

  optparse = OptionParser.new do |opts|
    opts.banner = "Usage: #{File.basename($0)} [options] start|stop|restart|run"

    opts.on('-h', '--help', 'Show this message') do
      puts opts
      exit 1
    end
    opts.on('--cert-path=PATH', 'Path to directory containing apn .pem certificates.') do |path|
      @options[:cert_root] = path
    end
    opts.on('c', '--full-cert-path=PATH', 'Full path to desired .pem certificate.') do |path|
      @options[:full_cert_path] = path
    end
    opts.on('--cert-pass=PASSWORD', 'Password for the apn .pem certificates.') do |pass|
      @options[:cert_pass] = pass
    end
    opts.on('--cert-name=NAME', 'Certificate file name. Default: apn_production.pem') do |certificate_name|
      @options[:certificate_name] = certificate_name
    end
    opts.on('-n', '--number-of-workers=WORKERS', "Number of unique workers to spawn") do |worker_count|
      @options[:worker_count] = worker_count.to_i rescue 1
    end
    opts.on('-d', '--delay=D', "Delay between rounds of work (seconds)") do |d|
      @options[:delay] = d
    end
  end

  # If no arguments, give help screen
  @args = optparse.parse!(args.empty? ? ['-h'] : args)
end

Public Instance Methods

daemonize() click to toggle source
# File lib/apn/sender_daemon.rb, line 51
def daemonize
  @options[:worker_count].times do |worker_index|
    process_name = @options[:worker_count] == 1 ? "apn_sender" : "apn_sender.#{worker_index}"
    pids_dir = defined?(Rails) ? "#{::RAILS_ROOT}/tmp/pids" : "tmp/pids"
    Daemons.run_proc(process_name, :dir => pids_dir, :dir_mode => :normal, :ARGV => @args) do |*args|
      run(process_name)
    end
  end
end
run(worker_name = nil) click to toggle source
# File lib/apn/sender_daemon.rb, line 61
def run(worker_name = nil)
  APN.password = @options[:cert_pass]
  APN.full_certificate_path = @options[:full_cert_path]
  APN.root = @options[:cert_root]
  APN.certificate_name = @options[:certificate_name]

  worker = ::Resque::Worker.new(APN::Jobs::QUEUE_NAME)
  worker.work(@options[:delay])
rescue => e
  STDERR.puts e.message
  exit 1
end