lib/resque_aps.rb in resque-aps-0.9.9 vs lib/resque_aps.rb in resque-aps-0.9.10

- old
+ new

@@ -12,129 +12,149 @@ module Resque module Plugins module Aps - def logger=(logger) - @logger = logger - end + def logger=(logger) + @logger = logger + end - def logger - unless @logger - @logger = Logger.new(STDOUT) - @logger.level = Logger::WARN - end - @logger - end + def logger + unless @logger + @logger = Logger.new(STDOUT) + @logger.level = Logger::WARN + end + @logger + end - def aps_gateway_host=(host) - @aps_gateway_host = host - end + def aps_gateway_host=(host) + @aps_gateway_host = host + end - def aps_gateway_host - @aps_gateway_host ||= "gateway.sandbox.push.apple.com" - end + def aps_gateway_host + @aps_gateway_host ||= "gateway.sandbox.push.apple.com" + end - def aps_gateway_port=(port) - @aps_gateway_port = port - end + def aps_gateway_port=(port) + @aps_gateway_port = port + end - def aps_gateway_port - @aps_gateway_port ||= 2195 - end + def aps_gateway_port + @aps_gateway_port ||= 2195 + end - def aps_feedback_host=(host) - @aps_feedback_host = host - end + def aps_feedback_host=(host) + @aps_feedback_host = host + end - def aps_feedback_host - @aps_feedback_host ||= "feedback.sandbox.push.apple.com" - end + def aps_feedback_host + @aps_feedback_host ||= "feedback.sandbox.push.apple.com" + end - def aps_feedback_port=(port) - @aps_feedback_port = port - end + def aps_feedback_port=(port) + @aps_feedback_port = port + end - def aps_feedback_port - @aps_feedback_port ||= 2196 - end + def aps_feedback_port + @aps_feedback_port ||= 2196 + end - def aps_queue_size_lower=(size) - @aps_queue_size_lower = size - end + def aps_queue_size_upper=(size) + @aps_queue_size_upper = size + end - def aps_queue_size_lower - @aps_queue_size_lower ||= 0 - end + def aps_queue_size_upper + @aps_queue_size_upper ||= 1000 + end - def aps_queue_size_upper=(size) - @aps_queue_size_upper = size - end + def aps_application_job_limit=(size) + @aps_queue_size_upper = size + end - def aps_queue_size_upper - @aps_queue_size_upper ||= 500 - end + def aps_application_job_limit + @aps_application_job_limit ||= 5 + end - def enqueue_aps(application_name, notification) - count = aps_notification_count_for_application(application_name) - redis.rpush(aps_application_queue_key(application_name), encode(notification.to_hash)) - enqueue(Resque::Plugins::Aps::Application, application_name) if count <= aps_queue_size_lower || count >= aps_queue_size_upper - true - end + def aps_applications_queued_count(application_name) + redis.get(aps_application_queued_key(application_name)) || 0 + end + + def enqueue_aps_application(application_name, override = false) + count_apps = aps_applications_queued_count(application_name) + count_not = aps_notification_count_for_application(application_name) + if override || count_apps <= 0 || (count_apps < aps_application_job_limit && (count_not > aps_queue_size_upper && count_not % (aps_queue_size_upper / 10) == 0)) + enqueue(Resque::Plugins::Aps::Application, application_name) + redis.incr(aps_application_queued_key(application_name)) + end + end + + def dequeue_aps_application(application_name) + redis.decr(aps_application_queued_key(application_name)) if aps_applications_queued_count(application_name) > 0 + end + + def enqueue_aps(application_name, notification) + redis.rpush(aps_application_queue_key(application_name), encode(notification.to_hash)) + enqueue_aps_application(application_name) + true + end - def dequeue_aps(application_name) - h = decode(redis.lpop(aps_application_queue_key(application_name))) - return Resque::Plugins::Aps::Notification.new(h) if h - nil - end + def dequeue_aps(application_name) + h = decode(redis.lpop(aps_application_queue_key(application_name))) + return Resque::Plugins::Aps::Notification.new(h) if h + nil + end - # Returns the number of queued notifications for a given application - def aps_notification_count_for_application(application_name) - redis.llen(aps_application_queue_key(application_name)).to_i - end + # Returns the number of queued notifications for a given application + def aps_notification_count_for_application(application_name) + redis.llen(aps_application_queue_key(application_name)).to_i + end - # Returns an array of queued notifications for the given application - def aps_notifications_for_application(application_name, start = 0, count = 1) - r = redis.lrange(aps_application_queue_key(application_name), start, count) - if r - r.map { |h| Resque::Plugins::Aps::Notification.new(decode(h)) } - else - [] - end - end + # Returns an array of queued notifications for the given application + def aps_notifications_for_application(application_name, start = 0, count = 1) + r = redis.lrange(aps_application_queue_key(application_name), start, count) + if r + r.map { |h| Resque::Plugins::Aps::Notification.new(decode(h)) } + else + [] + end + end - def create_aps_application(name, cert_file, cert_passwd = nil) - redis.set(aps_application_key(name), encode({'name' => name, 'cert_file' => cert_file, 'cert_passwd' => cert_passwd})) - redis.sadd(:aps_applications, name) - end + def create_aps_application(name, cert_file, cert_passwd = nil) + redis.set(aps_application_key(name), encode({'name' => name, 'cert_file' => cert_file, 'cert_passwd' => cert_passwd})) + redis.sadd(:aps_applications, name) + end - def aps_application(name) - h = decode(redis.get(aps_application_key(name))) - return Resque::Plugins::Aps::Application.new(h) if h - nil - end + def aps_application(name) + h = decode(redis.get(aps_application_key(name))) + return Resque::Plugins::Aps::Application.new(h) if h + nil + end - # Returns an array of applications based on start and count - def aps_application_names(start = 0, count = 1) - a = redis.smembers(:aps_applications) - return a if count == 0 - ret = a[start..(start + count)] - return [] unless ret - ret - end + # Returns an array of applications based on start and count + def aps_application_names(start = 0, count = 1) + a = redis.smembers(:aps_applications) + return a if count == 0 + ret = a[start..(start + count)] + return [] unless ret + ret + end - # Returns the number of application queues - def aps_applications_count - redis.smembers(:aps_applications).size - end + # Returns the number of application queues + def aps_applications_count + redis.smembers(:aps_applications).size + end - def aps_application_key(application_name) - "aps:application:#{application_name}" - end + def aps_application_key(application_name) + "aps:application:#{application_name}" + end - def aps_application_queue_key(application_name) - "#{aps_application_key(application_name)}:queue" - end + def aps_application_queued_key(application_name) + "#{aps_application_key(application_name)}:queued" + end + + def aps_application_queue_key(application_name) + "#{aps_application_key(application_name)}:queue" + end end end end Resque.extend Resque::Plugins::Aps