-
Notifications
You must be signed in to change notification settings - Fork 2.5k
Active Job
Rails 4.2 introduced Active Job. Active Job is a standard interface for interacting with job runners. Active Job can be configured to work with Sidekiq.
Note that more advanced Sidekiq features cannot be controlled or configured via ActiveJob, e.g. retry configuration or saving backtraces.
The Active Job adapter must be set to :sidekiq or it will simply use the default :inline. This can be done in config/application.rb like this:
class Application < Rails::Application
# ...
config.active_job.queue_adapter = :sidekiq
endWe can use the generator to create a new job.
rails generate job ExampleThis above command will create /app/jobs/example_job.rb
class ExampleJob < ActiveJob::Base
# Set the Queue as Default
queue_as :default
def perform(*args)
# Perform Job
end
endJobs can be added to the job queue from anywhere. We can add a job to the queue by:
ExampleJob.perform_later argsAt this point, Sidekiq will run the job for us. If the job for some reason fails, Sidekiq will retry as normal.
Action Mailer now comes with a method named #deliver_later which will send emails asynchronously (your emails send in a background job). As long as Active Job is setup to use Sidekiq we can use #deliver_later. Unlike Sidekiq, using Active Job will serialize any activerecord instance with Global ID. Later the instance will be deserialized.
Mailers are queued in the queue mailers. Remember to start sidekiq processing that queue:
bundle exec sidekiq -q default -q mailers.
To send a basic message to the Job Queue we can use:
UserMailer.welcome_email(@user).deliver_laterIf you would like to bypass the job queue and perform the job synchronously you can use:
UserMailer.welcome_email(@user).deliver_nowWith Sidekiq we had the option to send emails with a set delay. We can do this through Active Job as well.
Old syntax for delayed message in Sidekiq:
UserMailer.delay_for(1.hour).welcome_email(@user.id)
UserMailer.delay_until(5.days.from_now).welcome_email(@user.id)New syntax to send delayed message through Active Job:
UserMailer.welcome_email(@user).deliver_later!(wait: 1.hour)
UserMailer.welcome_email(@user).deliver_later!(wait_until: 10.hours.from_now)Active Job cannot configure any Sidekiq-specific options, including retry.