How does Delayed Job work in Ruby on Rails ?

ruby-on-rails, ruby-on-rails-3

Solution

- Does DJ script checks the table every minute and when the time matches job_at time, it runs that job ?

When you run `rake jobs:work` DelayedJob will poll the `delayed_jobs` table, performing jobs matching the `job_at` column value if it's been set. This part you're correct about.

- How it is different than cron (whenever gem) if the script is just checking the table every min ?

`whenever` is a gem that helps you configure a crontab. It has nothing directly to do with performing tasks on your server on a periodic basis.

You could setup a cron to run whatever tasks exist in the queue every minute, but leaving a `delayed_job` daemon running has multiple benefits.

- Even if the cron ran every minute, `delayed_job`'s daemon will see and perform any jobs queued within that 1-minute window between cron runs

- Every time the cron would run, it will rebuild a new Rails environment in which to perform the jobs. This is a waste of time and resources when the daemon can just sit there immediately ready to perform a newly queued job.

If you want to configure `delayed_job` through a cron every minute you can add something like this to your crontab

* * * * * RAILS_ENV=production script/delayed_job start --exit-on-complete

Every minute, delayed_job will spin up, perform whatever jobs are ready for it or which it must retry from a previously failed run, and then quit. I don't recommend this though. Setting up a delayed_job as a daemon is the right way to go.

Problem

I am new to this and is little confused about how Delayed Job works ? I know it creates a table and puts the jobs in the table and then I need to run ``` rake jobs:work ``` to start the background process. Now my question is Does DJ script checks the table every minute and when the time matches job_at time, it runs that job ? How it is different than cron (whenever gem) if the script is just checking the table every min ? Thanks

Original source