如何创建带有钩子/回调的delay_job作业?

时间:2020-07-02 21:25:50

标签: ruby-on-rails ruby delayed-job rails-activejob

我正在Rails应用程序中使用delayed_job的最基本版本。我将一个delay_job的最大时间设置为10分钟。我想使钩子/回调正常工作,以便在工作停止在10分钟后停止执行。

我在Rails应用程序中设置了此设置: config.active_job.queue_adapter =:delayed_job

这是我通常将工作排队的方式: object.delay.object_action

挂钩/回调示例适用于命名作业,但基本的入门步骤不适用于命名作业。所以我认为我没有一份有名的工作。这是使回调正常工作的示例:

class ParanoidNewsletterJob < NewsletterJob
  def enqueue(job)
    record_stat 'newsletter_job/enqueue'
  end

  def perform
    emails.each { |e| NewsletterMailer.deliver_text_to_email(text, e) }
  end

  def before(job)
    record_stat 'newsletter_job/start'
  end

  def after(job)
    record_stat 'newsletter_job/after'
  end

  def success(job)
    record_stat 'newsletter_job/success'
  end

  def error(job, exception)
    Airbrake.notify(exception)
  end

  def failure(job)
    page_sysadmin_in_the_middle_of_the_night
  end
end

我很想触发错误或错误钩子/回调。

我应将这些回调放在我的Rails应用程序中的什么位置,以使它们触发基本的delay_job设置?如果我应该使用ActiveJob回调,那么在使用了delay_job的情况下,您将那些回调放在哪里?

1 个答案:

答案 0 :(得分:1)

如果您想使用回调等更高级的功能,则不能使用object.delay.object_action便捷语法。 #delay便捷方法将生成一个工作对象,其工作原理与此类似:

# something like this is already defined in delayed_job
class MethodCallerJob
  def initialize(object, method, *args)
    @object = object
    @method = method
    @args = args
  end

  def perform
    @object.send(@method, *@args)
  end
end

# `object.delay.object_action` does the below automatically for you

# instantiates a job with your object and method call
job = MethodCallerJob.new(object, :object_action, [])
Delayed::Job.enqueue(job) # enqueues it for running later

然后,在工作工作者中,发生以下类似情况:

job = Delayed::Job.find(job_id) # whatever the id turned out to be
job.invoke_job # does all the things, including calling #perform and run any hooks
job.delete # if it was successful

您必须创建什么the delayed_job README calls "Custom Jobs",它们是至少定义了#perform的普通POROs。然后,您可以对其进行自定义,并添加delayed_job用于max_run_timequeue_name等其他功能以及要使用的功能的所有其他方法:callbacks和{{ 1}}。

旁注:上面的信息用于直接使用hooks。使用delayed_job也可以完成上述所有操作。您只需阅读ActiveJob方式,就可以阅读有关如何操作的文档和指南,就像我已经将您链接到上面的ActiveJob自述文件一样。