はじめに
Shoryuken を使った非同期処理にハマっているのでメモ。
やりたいこと
- Shoryukenを使ってメール処理を非同期で送信したい
- ActiveJobのキュー保存先はAWS SQS
発生したエラー
2020-01-23T06:44:31Z 9395 TID-goxzcpc3k ActiveJob/ActionMailer::DeliveryJob/dev-myapp-mail.fifo/9a1e3787-c13d-474f-a4f4-289f1360493b INFO: failed in: 761.5111479999999 ms 2020-01-23T06:44:31Z 9395 TID-goxzcpc3k ERROR: Processor failed: Error while trying to deserialize arguments: Couldn't find Hoge with 'id'=1
原因
ActiveJobにActicveRecordオブジェクトを丸ごと渡しているため。
hoge = Hoge.find_by(params[:hoge_id]) ApplicationMailer.send_email(hoge, address_list).deliver_later
回避策
ActicveRecordオブジェクトを丸ごと渡すのではなく、Hash
などで必要な情報のみActiveJobに渡す。
参考情報
ActiveJob はキューに一旦保存する関係で、オブジェクトを渡す場合シリアライズしています。 ActiveRecordのインスタンスであれば、テーブルを持つ前提なので、IDをJobに渡し、findするという動作を裏でしています。 今回動かすだけであれば、オブジェクトをまるごと渡すのではなく、 Hashや title などの String のような必要な情報のみ渡せば良いとおもいます。