Ruby on rails ActiveJob序列化:不调用反序列化

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

因此,我尝试实现一个相当简单的示例,从中重写ActiveJobs的serialize et deserialize方法,以在作业重试之间保存一个尝试次数整数

我已尝试在RAILS 4.2.7.1上的项目中实现该示例,结果如下:

  • 一个非常简单的作业类,使用“活动的弹性作业”队列

    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
    
现在的问题是,反序列化方法似乎从未被调用,因为我尝试在其中添加binding.pry,但没有效果。 运行RSpec时,我得到的只是以下问题,我认为这是由于缺少反序列化调用造成的:

    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'