HTTPS clone URL
Subversion checkout URL
- Active Job
- Advanced Options
- Best Practices
- Commercial collaboration
- Commercial FAQ
- Commercial Support
- Complex Job Workflows with Batches
- Delayed extensions
- Deploying to Ubuntu
- Ent Leader Election
- Ent Periodic Jobs
- Ent Rate Limiting
- Ent Unique Jobs
- Error Handling
- Expiring Jobs
- Getting Started
- Job Control
- Job Format
- Pro API
- Problems and Troubleshooting
- Related Projects
- Resque Compatibility
- Scheduled Jobs
- The Basics
- UI Filtering
- Using Redis
Clone this wiki locally
Delayed extensions provide a very easy and simple way to make method calls asynchronous. By default, all class methods and ActionMailer deliveries can be performed asynchronously.
delay to deliver your emails asynchronously. Use
delay_until(time) to deliver the email at some point in the future.
UserMailer.delay.welcome_email(@user.id) UserMailer.delay_for(5.days).find_more_friends_email(@user.id) UserMailer.delay_until(5.days.from_now).find_more_friends_email(@user.id)
It is recommended to avoid passing an object instance to mailer methods. Instead, pass an object id and then re-instantiate the object in the mailer method, per Best Practices.
You can also easily extend the devise gem to send emails using sidekiq.
delay_until(time) to asynchronously execute arbitrary methods on your ActiveRecord classes.
User.delay.delete_old_users('some', 'params') User.delay_for(2.weeks).whatever User.delay_until(2.weeks.from_now).whatever
I strongly recommend avoiding delaying methods on instances. This stores object state in Redis which can get out of date, causing stale data problems.
Any class method can be delayed via the same methods as above:
MyClass.delay.some_method(1, 'bob', true)
Just remember to keep the method arguments simple, don't pass complex Ruby objects.
You can tune the options used with a
.delay call by passing in options:
MyClass.delay(:retry => false).some_method(1, 2, 3) MyClass.delay(:queue => 'low').some_method(1, 2, 3) MyClass.delay_for(10.minutes, :retry => false).some_method(1, 2, 3)
The delay extensions can conflict with DelayedJob if you want to run both in the same process. You can disable them in a Rails application by calling
Sidekiq.remove_delay! in an initializer. This will prevent the delay extension modules from ever being loaded. If you would like to include the delay extensions prefixed with
Sidekiq.hook_rails! first in your initializer:
# config/initializers/sidekiq.rb # Sidekiq.hook_rails! # uncomment if you want the delay extensions, but prefixed with `sidekiq_` Sidekiq.remove_delay!
If you are using Sidekiq outside of a Rails application, the class method extensions are always loaded.