Rails)のActionJob
とのインターフェースの一般的なパターンは、perform_now
またはperform_later
を介して非同期に呼び出されるperform()
メソッドを使用してジョブを設定することです
メーラーの特殊なケースでは、ActionJob
はActionMailer
と統合されているため、deliver_now
またはdeliver_later
を直接呼び出すことができます。
Railsのドキュメント には次のコメントがあります-
# 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
この文言は、deliver_now
がメールを送信するためにActiveJob
を使用しないように見せかけます。それは正しいですか、正しい場合、deliver_now
とdeliver_later
の真の違いは何ですか?非同期ではありませんか?
同様に、同じ違いはperform_now
とperform_later
にも当てはまりますか?
ありがとう!
あなたの質問で言うように、deliver_now
はActiveJob
を使用しません。
基本的に、deliver_later
は非同期です。この方法を使用すると、電子メールは現時点では送信されず、ジョブのキューにプッシュされます。ジョブが実行されていない場合、電子メールは送信されません。 deliver_now
は、ジョブの状態に関係なく、現時点でメールを送信します。 ここdeliver
メソッドのドキュメントを見ることができます。
2番目の質問によると、perform_now
はキューに送信せずにジョブをすぐに処理します。ただし、perform_later
はジョブをキューに追加し、ジョブのキューが解放されるとすぐにジョブを実行します。 ここperform
メソッドのドキュメントを見ることができます。
Daniel Batallaが書いたものに加えて、私が行ったもう1つの観察があります:deliver_later
は遅延評価を実行するようですが、deliver_now
は実行しません。
データベースに保存されていない追加属性reset_token
を持つActiveRecordモデルがあります(これはMichael Hartlのrailstutorial.orgからのものです。モデルはreset_digest
列にトークンのハッシュバージョンを保存します)。
deliver_now
を実行するときに、メーラービュー内の@model
のreset_token
属性にアクセスすると、期待どおりにリセットトークンが生成されます。ただし、deliver_later
を実行すると、@model.reset_token
は常にnil
になります。 deliver_later
はデータベースデータでモデルを更新するかのように見えます。reset_token
はデータベースによってサポートされない追加の属性であるため、その時点ではnil
になります。 (コードドキュメントはネストが深すぎるため、ソースでこれを確認できません。)
マイケルはチュートリアルでdeliver_now
を使用しています。私は彼が怠惰な評価を避けるためにこれをするのを知りません。しかし、テストに合格するためにdeliver_later
をdeliver_now
に変更する必要があることを理解するのにしばらく時間がかかりました。