2016-11-18 14 views
4

私は本番環境でメールを送信しようとしていますが、Activejob deserailization error.sidekiqがバックグラウンドで実行されています。私はサイドキックの宝石を加えました。 comment_notification.rbには、ユーザーに電子メールを送信するためのメソッドが1つあります。それは、ローカルサーバーで正常に動作しましたが、生産に私はこのエラーにActiveJob :: DeserializationError:引数を逆シリアル化しようとしたときにエラーが発生しました

/home/apps/commentpost/shared/bundle/ruby/2.3.0/gems/sidekiq-4.2.3/lib/sidekiq/processor.rb:69:in `run' 
/home/apps/commentpost/shared/bundle/ruby/2.3.0/gems/sidekiq-4.2.3/lib/sidekiq/util.rb:17:in `watchdog' 
/home/apps/commentpost/shared/bundle/ruby/2.3.0/gems/sidekiq-4.2.3/lib/sidekiq/util.rb:25:in `block in safe_thread' 
2016-11-18T06:47:16.162Z 19093 TID-uw66g ActionMailer::DeliveryJob JID-e56b150964abf082e78089d9 INFO: start 
2016-11-18T06:47:16.167Z 19093 TID-uw66g ActionMailer::DeliveryJob JID-e56b150964abf082e78089d9 INFO: fail: 0.005 sec 
2016-11-18T06:47:16.167Z 19093 TID-uw66g WARN: {"context":"Job raised exception","job":{"class":"ActiveJob::QueueAdapters::SidekiqAdapter::JobWrapper","wrapped":"ActionMailer::DeliveryJob","queue":"mailers","args":[{"job_class":"ActionMailer::DeliveryJob","job_id":"96e06bc6-1380-47b9-9393-9727868b3897","queue_name":"mailers","priority":null,"arguments":["CommentNotification","send_comment_email","deliver_later",{"_aj_globalid":"gid://commentpost/comment/40"},{"_aj_globalid":"gid://commentpost/User/20"}],"locale":"en"}],"retry":true,"jid":"e56b150964abf082e78089d9","created_at":1479450405.8364522,"enqueued_at":1479451636.1602836,"error_message":"Error while trying to deserialize arguments: Couldn't find Comment with 'id'=40","error_class":"ActiveJob::DeserializationError","failed_at":1479450405.8429642,"retry_count":6,"retried_at":1479451636.1668367},"jobstr":"{\"class\":\"ActiveJob::QueueAdapters::SidekiqAdapter::JobWrapper\",\"wrapped\":\"ActionMailer::DeliveryJob\",\"queue\":\"mailers\",\"args\":[{\"job_class\":\"ActionMailer::DeliveryJob\",\"job_id\":\"96e06bc6-1380-47b9-9393-9727868b3897\",\"queue_name\":\"mailers\",\"priority\":null,\"arguments\":[\"CommentNotification\",\"send_comment_email\",\"deliver_later\",{\"_aj_globalid\":\"gid://commentpost/comment/40\"},{\"_aj_globalid\":\"gid://commentpost/User/20\"}],\"locale\":\"en\"}],\"retry\":true,\"jid\":\"e56b150964abf082e78089d9\",\"created_at\":1479450405.8364522,\"enqueued_at\":1479451636.1602836,\"error_message\":\"Error while trying to deserialize arguments: Couldn't find Comment with 'id'=40\",\"error_class\":\"ActiveJob::DeserializationError\",\"failed_at\":1479450405.8429642,\"retry_count\":5,\"retried_at\":1479450981.998904}"} 
2016-11-18T06:47:16.167Z 19093 TID-uw66g WARN: ActiveJob::DeserializationError: Error while trying to deserialize arguments: Couldn't find Comment with 'id'=40 
2016-11-18T06:47:16.167Z 19093 TID-uw66g WARN:/

を取得しています私はこの

def create 
    CommentNotification.send_comment_mail(@current_user).deliver_later(wait: 1.minute) 
end 


def send_comment_email(current_user) 
    mail(to: current_user.email, 
    :subject => "commented on post", 
    :from => "<[email protected]>") 
end 

を追加したアクションを作成中に、コントローラに誰もがこの疑問についての私を助けていただけますか?このために私は感謝するでしょう。

+0

あなたがエラーを掲示したときに、引数をデシリアライズしようとしているときに、 '、エラーを特にこの部分をそれを読む:「ID」= 40'とコメントが見つかりませんでした。それはあなたに問題の解決のヒントを与えませんか? –

+0

idは40のデータベースにあり、コメントも作成しています。唯一の問題は、メールがトリガーされていないということです。 – asha

答えて

5

コントローラでcreateメソッドが正しく理解されているので、コメントも作成し、新しく作成したコメントの電子メールを送信しますか?

ここでコールバックを使用する方がよいでしょう。
は、我々は我々のプロジェクトで同じ問題を持っていて、私達はそのようなものを使用して、それを解決:

# in model 
after_commit :send_mail, on: :create 

private 

def send_mail 
    CommentNotification.send_comment_mail(campaign.user).deliver_later 
end 

は、その後、あなたはメールが配信される前に、レコードが実際にデータベースに存在することを確認することができます。

ここでの問題は、Comment#createを実行し、コントローラにメールをエンキューすることです。 SideksqがRailsが新しいコメントをコミットする前にタスクを実行するようになりました。
そして、あなたはこのエラーを正確に受け取ります。

よろしく、
スパ今

+0

コントローラで書き込めますか? 例:after_action:メールを送信する:[:create] – asha

+1

できます。しかし、あなたは 'CommentNotification.send_comment_mail(campaign.user).deliver_later(wait:5minutes)'などを使用するべきです。 after_commitと上記のメソッドの両方について – Spa

+0

が機能していません。それでも同じエラーが表示されます。 – asha

関連する問題