JobHunter
JobHunter is a library that cuts down on boilerplate when creating and finding Delayed::Job custom jobs. It replaces this:
Delayed::Job.enqueue(MyCustomJob.new(data, other_data), priority: 100, run_at: 5.hours.from_now)With this:
MyCustomJob.create(data, other_data)Installation
JobHunter supports DelayedJob 3.0+ with ActiveRecord as the backend. Just add job_hunter to your Gemfile.
Usage
Add extend JobHunter at the top of a class you plan to use as a custom job. After this line, you can set defaults for this job with run_at, priority, queue, and max_attempts:
class KustomJob < Struct.new(:model_id, :details)
extend JobHunter
run_at -> { 24.hours.from.now }
priority 37
queue :sugar_glider
max_attempts 4
def perform
# do amazing things
end
endrun_at accepts a Proc object. The value is evaluated when you enqueue a new custom job.
JobHunter also provides class methods to find, create, and destroy jobs:
model_id = 22
details = "You seem to a have a squid on your head."
KustomJob.create(model_id, details)
KustomJob.find(model_id, details)
KustomJob.find_or_create(model_id, details)
KustomJob.delete(model_id, details)
Adding an index to handler in the delayed_jobs table is recommended if you plan on making regular use of find or find_or_create.
All of these methods will return a Delayed::Job if they find, create, or destroy a job and nil otherwise.
find will not return failed jobs (all attempts exhausted). find_or_create will likewise create a new job if there is an identical failed job.
The create and find_or_create methods accept the same options hash as Delayed::Job.enqueue. Options passed in to these methods (run_at, queue, and priority) will override the defauls set in your custom job class. Options passed in to find_or_create will not affect a job already enqueued.
These class methods have corresponding instance methods:
model_id = 22
details = "You seem to a have a squid on your head."
custom_job = KustomJob.new model_id, details
job.find
job.create
job.find_or_create
job.deleteUnlike the identically named class methods, #create and #find_or_create do not take an options hash. However, you can still override defaults by initializing your class by using new_with_options:
super_custom_job = KustomJob.new_with_options model_id, details, run_at: 12.minutes.from.now
super_custom_job.create