class Delayed::Quota

Attributes

interval[RW]
queue[RW]
reached[RW]
size[RW]
started[RW]

Public Class Methods

new(options) click to toggle source
# File lib/delayed_job_memento/delayed/quota.rb, line 8
def initialize(options)
  self.queue = options[:queue]
  self.interval = options[:interval]
  self.size = options[:size]
  self.started, self.reached = nil, nil
  self.instances[self.queue] = self
end

Public Instance Methods

quota_reached?() click to toggle source

fix class variables to instances

# File lib/delayed_job_memento/delayed/quota.rb, line 17
def quota_reached?
  current_time = Time.zone.now
  if self.reached != nil
    time_left = self.interval - (self.reached - self.started)
    if self.reached + time_left < current_time
      self.reached = nil
      self.started = current_time
      false
    else
      true
    end
  else
    if self.started != nil
      conditions = {
          queue: self.queue,
          created_at: self.started..current_time,
          locked_at: Time.new(0)..current_time
      }
      finished_jobs = Delayed::Memento.where(queue: self.queue,created_at: self.started..current_time,locked_at: Time.new(0)..current_time).count
      if finished_jobs >= self.size
        self.reached = current_time
        true
      else
        false
      end
    else
      self.started = current_time
      false
    end
  end
end
rebalance_queue() click to toggle source
# File lib/delayed_job_memento/delayed/quota.rb, line 49
def rebalance_queue
  run_at = self.interval - (self.reached - self.started)
  conditions = {queue: self.queue, locked_at: nil}
  Delayed::Job.where(conditions).find_in_batches(batch_size: self.size) do |batch|
    batch.each { |job| job.run_at = run_at }
    Delayed::Job.import batch, validate: false, on_duplicate_key_update: [:run_at]
    run_at= run_at + self.interval
  end
end