Parent

Included Modules

Delayed::Backend::DataMapper::Job

Public Class Methods

clear_locks!(worker_name) click to toggle source

When a worker is exiting, make sure we don't have any locked jobs.

# File lib/delayed/backend/data_mapper.rb, line 45
def self.clear_locks!(worker_name)
  all(:locked_by => worker_name).update(:locked_at => nil, :locked_by => nil)
end
db_time_now() click to toggle source
# File lib/delayed/backend/data_mapper.rb, line 20
def self.db_time_now
  DateTime.now
end
delete_all() click to toggle source

these are common to the other backends, so we provide an implementation

# File lib/delayed/backend/data_mapper.rb, line 76
def self.delete_all
  Delayed::Job.auto_migrate!
end
find(id) click to toggle source
# File lib/delayed/backend/data_mapper.rb, line 80
def self.find id
  get id
end
find_available(worker_name, limit = 5, max_run_time = Worker.max_run_time) click to toggle source
# File lib/delayed/backend/data_mapper.rb, line 24
def self.find_available(worker_name, limit = 5, max_run_time = Worker.max_run_time)
  
  simple_conditions = { :run_at.lte => db_time_now, :limit => limit, :failed_at => nil, :order => [:priority.asc, :run_at.asc]  }

  # respect priorities
  simple_conditions[:priority.gte] = Worker.min_priority if Worker.min_priority
  simple_conditions[:priority.lte] = Worker.max_priority if Worker.max_priority
  
  # lockable 
  lockable = (
    # not locked or past the max time
    ( all(:locked_at => nil ) | all(:locked_at.lt => db_time_now - max_run_time)) |

    # OR locked by our worker
    all(:locked_by => worker_name))
    
  # plus some other boring junk 
  (lockable).all( simple_conditions )
end

Public Instance Methods

lock_exclusively!(max_run_time, worker = worker_name) click to toggle source

Lock this job for this worker. Returns true if we have the lock, false otherwise.

# File lib/delayed/backend/data_mapper.rb, line 51
def lock_exclusively!(max_run_time, worker = worker_name)

  now = self.class.db_time_now
  overtime = now - max_run_time
  
  # FIXME - this is a bit gross
  # DM doesn't give us the number of rows affected by a collection update
  # so we have to circumvent some niceness in DM::Collection here
  collection = locked_by != worker ?
    (self.class.all(:id => id, :run_at.lte => now) & ( self.class.all(:locked_at => nil) | self.class.all(:locked_at.lt => overtime) ) ) :
    self.class.all(:id => id, :locked_by => worker)
  
  attributes = collection.model.new(:locked_at => now, :locked_by => worker).dirty_attributes
  affected_rows = self.repository.update(attributes, collection)
    
  if affected_rows == 1
    self.locked_at = now
    self.locked_by = worker
    return true
  else
    return false
  end
end
update_attributes(attributes) click to toggle source
# File lib/delayed/backend/data_mapper.rb, line 84
def update_attributes(attributes)
  attributes.each do |k,v|
    self[k] = v
  end
  self.save
end

[Validate]

Generated with the Darkfish Rdoc Generator 2.