Created
March 21, 2013 09:01
-
-
Save kristianhellquist/5211683 to your computer and use it in GitHub Desktop.
Delayed job, fetching and locking a job
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# We get up to 5 jobs from the db. In case we cannot get exclusive access to a job we try the next. | |
# this leads to a more even distribution of jobs across the worker processes | |
find_available(worker.name, 5, max_run_time).detect do |job| | |
job.lock_exclusively!(max_run_time, worker.name) | |
end | |
# Find a few candidate jobs to run (in case some immediately get locked by others). | |
def self.find_available(worker_name, limit = 5, max_run_time = Worker.max_run_time) | |
scope = self.ready_to_run(worker_name, max_run_time) | |
scope = scope.scoped(:conditions => ['priority >= ?', Worker.min_priority]) if Worker.min_priority | |
scope = scope.scoped(:conditions => ['priority <= ?', Worker.max_priority]) if Worker.max_priority | |
::ActiveRecord::Base.silence do | |
scope.by_priority.all(:limit => limit) | |
end | |
end | |
# Lock this job for this worker. | |
# Returns true if we have the lock, false otherwise. | |
def lock_exclusively!(max_run_time, worker) | |
now = self.class.db_time_now | |
affected_rows = if locked_by != worker | |
# We don't own this job so we will update the locked_by name and the locked_at | |
self.class.update_all(["locked_at = ?, locked_by = ?", now, worker], ["id = ? and (locked_at is null or locked_at < ?) and (run_at <= ?)", id, (now - max_run_time.to_i), now]) | |
else | |
# We already own this job, this may happen if the job queue crashes. | |
# Simply resume and update the locked_at | |
self.class.update_all(["locked_at = ?", now], ["id = ? and locked_by = ?", id, worker]) | |
end | |
if affected_rows == 1 | |
self.locked_at = now | |
self.locked_by = worker | |
self.locked_at_will_change! | |
self.locked_by_will_change! | |
return true | |
else | |
return false | |
end | |
end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment