首页 > 解决方案 > 如何使用钩子/回调创建延迟作业作业?

问题描述

我在 Rails 应用程序中使用了最基础的延迟作业版本。我将延迟作业的最大时间设置为 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

我很想触发 after 或 error 挂钩/回调。

我应该将这些回调放在我的 Rails 应用程序中的什么位置,以让它们为基本的延迟作业设置触发?如果我应该使用 ActiveJob 回调,你把这些回调放在哪里?

标签: ruby-on-railsrubydelayed-jobrails-activejob

解决方案


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

您必须创建延迟作业自述文件所称的“自定义作业”,它们只是至少已定义的普通PORO 。#perform然后,您可以对其进行自定义并添加所有delayed_job用于额外功能的额外方法,例如max_run_time, queue_name,以及您想要使用的那些:callbacks& hooks

旁注:以上信息供delayed_job直接使用。以上所有方法也可以使用ActiveJob。您只需ActiveJob阅读文档和指南即可,就像我将您链接到delayed_job上面的自述文件一样。


推荐阅读