These days am working more on infrastructure or back ground tasks. Recently, I implemented Delayed Jobs for some background processes in our project.
Delayed Jobs(Steps):
- Added the gems “gem ‘delayed_job’ and gem ‘delayed_job_active_record'” to the Gemfile.
- Then ran:
- -> rails generate delayed_job:active_record
- -> rake db:migrate
- Ran the following to start or stop the delayed job:
- -> RAILS_ENV=production script/delayed_job start
- -> RAILS_ENV=production script/delayed_job stop
- Also, for local machine, we can start by running: rake jobs:work
- To make any changes to config, I update the file ‘/config/initializers/delayed_jobs_config’, for example, in my case, I increase the max attempts and max run time.
Customized Jobs:
- I needed to run a delayed job every time a record is updated/created in my DB.
- So, I created a custom task which gets called and enqueued into delayed job.
My Custom Job:
class PerformJob < Struct.new(:id)
def perform
Rails.logger.info "#{API_URL}#{id}"
url = URI.parse("#{API_URL}#{id}")
response = Net::HTTP.get_response(url)
Delayed::Worker.logger.add(Logger::INFO, "Response from delayed_job #{response.inspect}")
end
end
The Way I Called It From Model Observer:
Delayed::Job.enqueue(PerformJob.new(id), 0, 1.minutes.from_now.getutc)
Delayed Job Log:
Delayed::Worker.logger.add(Logger::INFO, “Test!”)
And update /config/initializer/delayed_job_config.rb to add following:
Delayed::Worker.logger = Rails.logger
Delayed::Worker.logger.auto_flushing = true
Note: The capistrano deployment was giving error for delay job stop/start so added the gem ‘daemons’ to avoid it!