The common pattern for interfacing with ActionJob
in Rails is to set up a Job with a perform()
method that gets called asynchronously via perform_now
or perform_later
In the special case of Mailers, you can directly call deliver_now
or deliver_later
since ActionJob
is well integrated with ActionMailer
.
The rails documentation has the following comments -
# If you want to send the email now use #deliver_now
UserMailer.welcome(@user).deliver_now
# If you want to send the email through Active Job use #deliver_later
UserMailer.welcome(@user).deliver_later
The wording makes it seem like deliver_now
will not use ActiveJob
to send the mail. Is that correct, and if so what's the true difference between deliver_now
and deliver_later
? Is one not asynchronous?
Similarly, does the same difference apply to perform_now
and perform_later
?
Thanks!
As you say in your question, deliver_now
does not use ActiveJob
.
Basically, deliver_later
is asynchronous. When you use this method, the email is not send at the moment, but rather is pushed in a job's queue. If the job is not running, the email will not be sent. deliver_now
will send the email at the moment, no matter what is the job's state. Here you can see the documentation for deliver
methods.
According to your second question, perform_now
will process the job immediately without sending to the queue. perform_later
, however, will add the job to the queue, and as soon the job's queue is free, will perform the job. Here you can see the documentation for perform
methods.