紙一重の積み重ね

アラフォーのエンジニアがなれる最高の自分を目指して、学んだことをこつこつ情報発信するブログです。

【Rails】Shoryukenを使った非同期処理で Error while trying to deserialize arguments: Couldn't find エラーが発生したときの対処法

f:id:yokoyantech:20200127140033p:plain

はじめに

Shoryuken を使った非同期処理にハマっているのでメモ。

やりたいこと

  • Shoryukenを使ってメール処理を非同期で送信したい
  • ActiveJobのキュー保存先はAWS SQS

github.com

発生したエラー

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に渡す。

参考情報

teratail.com

ActiveJob はキューに一旦保存する関係で、オブジェクトを渡す場合シリアライズしています。 ActiveRecordのインスタンスであれば、テーブルを持つ前提なので、IDをJobに渡し、findするという動作を裏でしています。 今回動かすだけであれば、オブジェクトをまるごと渡すのではなく、 Hashや title などの String のような必要な情報のみ渡せば良いとおもいます。