Delayed Jobs

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!