【问题标题】:Access the last_error in failure method of Delayed Job Rails访问延迟作业 Rails 的失败方法中的 last_error
【发布时间】:2013-02-10 09:56:00
【问题描述】:

我在 Rails 应用程序中使用延迟作业。每当延迟作业失败时,我想通知错误以进行空气烘烤。我检查了github 并了解了 failure 方法。

我想将延迟作业失败的 last_error 属性发送到 airbrake。像这样的:

class ParanoidNewsletterJob < NewsletterJob
   def perform

   end

   def failure
     Airbrake.notify(:message => self.last_error, :error_class => self.handler)
   end
 end

但它给了我以下运行时错误:

undefined method `last_error' for #<struct ParanoidNewsletterJob>

请帮我弄清楚如何将延迟作业失败的 last_error 通知 Airbrake。

非常感谢!!

【问题讨论】:

    标签: ruby-on-rails-3 runtime-error delayed-job airbrake


    【解决方案1】:

    有两种方法可以实现你想要的:

    1. 一种特定于作业的方法,它仅适用于您想要的作业类型,方法是实现以 job 作为参数的失败方法。该作业将包含 errorlast_error。这就是其他答案的意义所在。
    2. 一个全局选项,可以开发插件以将其应用于创建的任何作业类型。如果需要监视所有作业,则需要这样做。该插件可以注册并围绕作业生命周期中的各种事件执行操作。例如,如果我们想在存储到数据库之前对其进行处理,下面是一个更新 last_error 的插件

    下面的一个例子:

    require 'delayed_job'
    
    class ErrorDelayedJobPlugin < Delayed::Plugin
      def self.update_last_error(event, job)
        begin
          unless job.last_error.nil?
            job.last_error = job.last_error.gsub("\u0000", '')  # Replace null byte
            job.last_error = job.last_error.encode('UTF-8', invalid: :replace, undef: :replace, replace: '')
          end
        rescue => e
        end
      end
    
      callbacks do |lifecycle|
        lifecycle.around(:failure) do |worker, job, *args, &block|
          update_last_error(:around_failure, job)
          block.call(worker, job)
        end
      end
    end
    

    基本上,当任何作业发生任何故障时都会调用它。关于这个回调的工作原理,可以参考A plugin to update last_error in Delayed Job

    【讨论】:

      【解决方案2】:

      这应该可以正常工作

      def failure(job)
       Airbrake.notify(:message => job.error, :error_class => job.error.class, :backtrace => job.error.backtrace)
      end
      

      【讨论】:

        【解决方案3】:

        您应该能够将作业传递给失败方法,然后从作业中提取 last_error。即

        def failure(job)
          Airbrake.notify(:message => job.last_error, :error_class => job.handler)
        end
        

        【讨论】:

          猜你喜欢
          • 2011-06-01
          • 2011-08-30
          • 1970-01-01
          • 1970-01-01
          • 2011-03-04
          • 1970-01-01
          • 1970-01-01
          • 2015-10-06
          • 2015-03-11
          相关资源
          最近更新 更多