【发布时间】:2017-02-11 17:31:31
【问题描述】:
所以我正在尝试实现来自here 的相当简单的示例,它覆盖了 ActiveJobs 的序列化和反序列化方法,以在作业重试之间保存一个尝试数整数。
我已尝试在 RAILS 4.2.7.1 上将示例实施到我的项目中,结果如下:
-
一个非常简单且使用“active_elastic_job”队列的作业类
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 -
在 after_create 上使用 Job 的模型
class Model after_create do Job.perform_later(self.id) end end -
最后是一个旨在通过 Webmock 触发重试的 RSpec 测试
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
现在问题来了,反序列化方法似乎永远不会被调用,因为我尝试在其中添加 binding.pry 但无济于事。 我在运行 RSpec 时得到的只是以下问题,我认为这是由于缺少对反序列化的调用:
Failure/Error: if @attempt_number > 10
NoMethodError:
undefined method `>' for nil:NilClass
任何人都可以帮助我吗?如果即使用另一种方法来实现类似的功能。
【问题讨论】:
标签: ruby-on-rails activerecord serialization rspec amazon-elastic-beanstalk