ruby-on-rails – 使用Sidekiq进行活动作业并获取ActiveJob :: D
发布时间:2020-12-17 03:50:14 所属栏目:百科 来源:网络整理
导读:我正在尝试使用Sidekiq来完成以下工作. 未排队时执行该作业(perform_now),但在使用Sidekiq调用(perform_later)时失败. AddEmployeesToRoomJob.perform_now room ## works fineAddEmployeesToRoomJob.perform_later room ## breaks in Sidekiq 错误: AddEmpl
我正在尝试使用Sidekiq来完成以下工作.
未排队时执行该作业(perform_now),但在使用Sidekiq调用(perform_later)时失败. AddEmployeesToRoomJob.perform_now room ## works fine AddEmployeesToRoomJob.perform_later room ## breaks in Sidekiq 错误: AddEmployeesToRoomJob JID-da24b13f405b1ece1212bbd5 INFO: fail: 0.003 sec 2016-08-20T14:57:16.645Z 19456 TID-owmym5fbk WARN: {"class":"ActiveJob::QueueAdapters::SidekiqAdapter::JobWrapper","wrapped" :"AddEmployeesToRoomJob","queue":"default","args": [{"job_class":"AddEmployeesToRoomJob","job_id":"0ba5bd30-e281-49a7-a93f- 6e50445183ac","queue_name":"default","priority":null,"arguments": [{"_aj_globalid":"gid://dragonfly/Room/1"}],"locale":"en"}],"retry":true,"jid":"da24b13f405b1ece1212bbd5","created_at":1471704675.739077,"enqueued _at":1471705036.6406531,"error_message":"Error while trying to deserialize arguments: Couldn't find Room with 'id'=1","error_class":"ActiveJob::DeserializationError","failed_at":14717 04675.946183,"retry_count":4,"retried_at":1471705036.644416} 2016-08-20T14:57:16.645Z 19456 TID-owmym5fbk WARN: ActiveJob::DeserializationError: Error while trying to deserialize arguments: Couldn't find Room with 'id'=1 2016-08-20T14:57:16.645Z 19456 TID-owmym5fbk WARN: /Users/tamlyn/.rvm/gems/ruby-2.2.3/gems/activerecord- 5.0.0.1/lib/active_record/relation/finder_methods.rb:357:in `raise_record_not_found_exception!' 我的工作 def perform(room) employees = Employee.all if employees.length > 0 employees.each do |employee| UserRoom.create(user: employee,room: room) end end end end 我的想法 Sidekiq博士说 “不幸的是,这意味着如果在作业入队后但在调用perform方法之前删除[Room]记录,则异常处理会有所不同.” 他们建议一个解决方法,但我不知道这对我有什么帮助: rescue_from ActiveJob::DeserializationError do |exception| # handle a deleted user record end 在此先感谢您的帮助! 解决方法
我不认为将Room对象传递给Sidekiq工作者是个好主意.我总是传递数据库对象的主键,然后重新查询.试试这个.
AddEmployeesToRoomJob.perform_later room.id def perform(room_id) room = Room.find(room_id) employees = Employee.all if employees.length > 0 employees.each do |employee| UserRoom.create(user: employee,room: room) end end end end (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |