Как расширить ActiveJob для доступа к ловушкам сбоев/ошибок delayed_job?

Я использую адаптер delayed_job для rails ActiveJob, но хотел бы по-прежнему иметь доступ к перехватчикам ошибок и сбоев для запуска почтовых рассылок при ошибках или сбоях задания.

Я думаю, что нашел часть ActiveJob код, который мне нужно расширить, чтобы включить методы ошибок и сбоев в delayed_job.

Как мне расширить описанный ниже класс JobWrapper, включив в него методы ошибок и сбоев delayed_job, чтобы затем можно было использовать собственный код ошибок/сбоев для каждого задания?

require "delayed_job"

module ActiveJob

  module QueueAdapters

    class DelayedJobAdapter

      def enqueue(job)
        delayed_job = Delayed::Job.enqueue(JobWrapper.new(job.serialize), queue: job.queue_name, priority: job.priority)
        job.provider_job_id = delayed_job.id
        delayed_job
      end

      def enqueue_at(job, timestamp)
        delayed_job = Delayed::Job.enqueue(JobWrapper.new(job.serialize), queue: job.queue_name, priority: job.priority, run_at: Time.at(timestamp))
        job.provider_job_id = delayed_job.id
        delayed_job
      end

      class JobWrapper
        attr_accessor :job_data

        def initialize(job_data)
          @job_data = job_data
        end

        def perform
          Base.execute(job_data)
        end
      end
    end
  end
end

person chubsy    schedule 20.12.2016    source источник


Ответы (2)


Я считаю, что это то, что вы хотите

module ActiveJob
  module QueueAdapters
    class DelayedJobAdapter
      class JobWrapper
        def failure(job)
          job_data = Base.deserialize(job.payload_object.job_data)
          job_data.failure(job) if job_data.respond_to?(:failure)
        end
      end
    end
  end
end

Я разместил эту проблему/исправление для проблемы с рельсами https://github.com/rails/rails/issues/30205

person Jin.X    schedule 12.08.2017

ActiveJob реализует ActiveSupport::Rescuable, что означает вы можете использовать escape_from.

class MyJob < ActiveJob::Base

  rescue_from Exception do |e|
    # do something with e
  end

  # rest of your job

end
person Cristian Bica    schedule 19.01.2017
comment
проблема с использованием escape_from заключается в том, что он срабатывает при каждом исключении, а не при окончательном сбое отложенного задания. - person John Small; 01.11.2018