Ruby on rails ActiveJob序列化:不调用反序列化
因此,我尝试实现一个相当简单的示例,从中重写ActiveJobs的serialize et deserialize方法,以在作业重试之间保存一个尝试次数整数 我已尝试在RAILS 4.2.7.1上的项目中实现该示例,结果如下:Ruby on rails ActiveJob序列化:不调用反序列化,ruby-on-rails,activerecord,serialization,rspec,amazon-elastic-beanstalk,Ruby On Rails,Activerecord,Serialization,Rspec,Amazon Elastic Beanstalk,因此,我尝试实现一个相当简单的示例,从中重写ActiveJobs的serialize et deserialize方法,以在作业重试之间保存一个尝试次数整数 我已尝试在RAILS 4.2.7.1上的项目中实现该示例,结果如下: 一个非常简单的作业类,使用“活动的弹性作业”队列 class Job < ActiveJob::Base queue_as :a_queue def serialize super.merge('attempt_number' => (@a
- 一个非常简单的作业类,使用“活动的弹性作业”队列
class Job < ActiveJob::Base queue_as :a_queue def serialize super.merge('attempt_number' => (@attempt_number || 0) + 1) end def deserialize(job_data) super @attempt_number = job_data['attempt_number'] end rescue_from(Exceptions::NetworkError) do |error| logger.info "#{error}" if @attempt_number > 10 logger.info "Drop" else logger.info "Attempt #{@attempt_number}" retry_job wait: 1.hour end end def perform(id) ... end end
- 最后是一个RSpec测试,旨在通过Webmock触发重试
RSpec.describe CategorizerJob, type: :job do include ActiveJob::TestHelper # Some let calls for url, json and create context 'retry ctx' do it '404' do stub_request(:get, url).to_return(body: json, status: 404) perform_enqueued_jobs do expect_any_instance_of(Job) .to receive(:retry_job).with(wait: 1.hour) create() end end end
Failure/Error: if @attempt_number > 10
NoMethodError:
undefined method `>' for nil:NilClass
有人能帮我吗?即使使用其他方法来实现类似的功能。您也会遇到NetworkError异常。我认为您应该查看适配器的连接选项并找出它发生的原因。我遇到了类似的问题,并发现您应该在ActiveJob::Base子类上重写的方法是
反序列化参数。以下是执行作业时的堆栈跟踪:
activejob-4.2.8/lib/active_job/arguments.rb:42:in `deserialize'
activejob-4.2.8/lib/active_job/core.rb:90:in `deserialize_arguments'
activejob-4.2.8/lib/active_job/core.rb:80:in `deserialize_arguments_if_needed'
activejob-4.2.8/lib/active_job/execution.rb:30:in `perform_now'
activejob-4.2.8/lib/active_job/execution.rb:21:in `execute'
尽管文档中的示例另有说明,反序列化
是在ActiveJob::Arguments
中定义的,NetworkError异常是正常的。正如我所说,rspec的目标是通过回答404引发异常,从而触发rescue_中的重试。现在我知道我不应该在404上重试,这只是一个例子。此外,我需要帮助的地方是序列化,由于某些原因,它没有反序列化,这意味着在执行“if@trument\u number>10”时,我会得到一个nil对象,因此会出现错误。您可以在ActiveJob中阅读有关序列化和反序列化的更多信息:
activejob-4.2.8/lib/active_job/arguments.rb:42:in `deserialize'
activejob-4.2.8/lib/active_job/core.rb:90:in `deserialize_arguments'
activejob-4.2.8/lib/active_job/core.rb:80:in `deserialize_arguments_if_needed'
activejob-4.2.8/lib/active_job/execution.rb:30:in `perform_now'
activejob-4.2.8/lib/active_job/execution.rb:21:in `execute'