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
# File lib/delayed/backend/data_mapper.rb, line 20 def self.db_time_now DateTime.now end
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
# File lib/delayed/backend/data_mapper.rb, line 80 def self.find id get id end
# 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
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
Generated with the Darkfish Rdoc Generator 2.