ActiveJob :: DeserializationError: error trying to deserialize arguments

I try to send mail to production, but it throws an error deserailization Activejob.sidekiq is running in the background. I added sidekiq gem. I wrote one method in comment_notification.rb to send email to the user. Then in the controller in the action creation I added this

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 => "< noreply@xxx.com >") end 

It worked fine on the local server, but in production I get this error

 /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: / 

Can someone help me on this? For this I will be grateful.

+5
source share
1 answer

As I understand it correctly, the create method in the controller creates both a comment and sends a message to the comment just created?

Then it would be better to use the callback here.
We had the same problem in our project, and we solved it using something like this:

 # in model after_commit :send_mail, on: :create private def send_mail CommentNotification.send_comment_mail(campaign.user).deliver_later end 

Then you can be sure that the record really exists in the database before the mail is delivered.

The problem is that you run Comment#create and place the mail in the controller. Now it may happen that Sidekiq starts the task before Rails announces a new comment.
And then you get exactly this error.

Yours faithfully,
Spa

+5
source

Source: https://habr.com/ru/post/1259956/


All Articles