【问题标题】:Does active job call after_perform when perform raises an error?当执行引发错误时,活动作业是否调用 after_perform?
【发布时间】:2018-05-10 00:20:53
【问题描述】:

rails 文档没有指定如果在作业执行期间引发异常,是否调用回调。谁能确认这种行为?

子问题,如果实现了rescue_from,行为会改变吗?

如果在rescue_from中抛出错误怎么办?

【问题讨论】:

    标签: ruby-on-rails rails-activejob


    【解决方案1】:

    在活动作业中,如果引发错误,则不会调用 after_perform。我也没有在文档中看到它,但是活动作业中的错误处理要么手动完成(可能通过实现一个 rescue_from),要么由活动作业适配器处理。我知道对于延迟的作业适配器,如果在执行期间出现错误,该作业将重试几次,并且永远不会到达 after_perform。

    【讨论】:

      【解决方案2】:

      after_perform在执行perform的过程中如果出现错误,则不会执行perform,即使它被rescue_from救了。

      没有错误

      class FooJob < ActiveJob::Base
        after_perform do |job|
          puts 'after perform'
        end
      
        def perform
          puts "during perform"
        end
      end
      
      > FooJob.perform_now
      during perform
      after perform
      

      出现错误

      class FooJob < ActiveJob::Base
        after_perform do |job|
          puts 'after perform'
        end
      
        def perform
          puts "during perform"
          raise "error during perform"
        end
      end
      
      > FooJob.perform_now
      during perform
      # ... trace
      RuntimeError (error during perform)
      

      出现错误并救援

      class FooJob < ActiveJob::Base
        rescue_from(StandardError) do |exception|
          puts 'rescuing standard error: ' + exception.message
        end
      
        after_perform do |job|
          puts 'after perform'
        end
      
        def perform
          puts "during perform"
          raise StandardError, "error during perform"
        end
      end
      
      > FooJob.perform_now
      during perform
      # ... trace
      rescuing standard error: error during perform
      #<StandardError: error during perform> 
      

      【讨论】:

        猜你喜欢
        • 2015-12-26
        • 1970-01-01
        • 1970-01-01
        • 2022-01-18
        • 2015-07-18
        • 1970-01-01
        • 2017-10-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多