如何使用 hooks/callbacks 创建 delayed_job 个职位?

How do I create delayed_job jobs with hooks/callbacks?

我在 Rails 应用程序中使用 delayed_job 的最基本版本。我将 delayed_job 允许的最长时间设置为 10 分钟。我想让 hooks/callbacks 正常工作,这样我就可以在作业在 10 分钟后停止执行后做一些事情。

我的 rails 应用程序中有这个设置: config.active_job.queue_adapter = :delayed_job

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

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

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 hooks/callbacks。

我应该在我的 Rails 应用程序中的什么地方放置这些回调,以便为基本的 delayed_job 设置触发它们?如果我应该使用 ActiveJob 回调,你会把那些回调放在哪里,因为 delayed_job 正在被使用?

如果您需要回调等更高级的功能,则不能使用 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 worker 中,会发生如下情况:

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

您必须创建至少具有 #perform 定义的 the delayed_job README calls "Custom Jobs", which are just plain 。然后您可以自定义它并添加 delayed_job 用于额外功能的所有额外方法,例如 max_run_timequeue_name,以及您想要使用的方法:callbacks & hooks.

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

您可以通过这样的方式创建 delayed_job hooks/callback

module Delayed
  module Plugins
   class TestHooks < Delayed::Plugin
     callbacks do |lifecycle|
       lifecycle.before(:perform) do |_worker, job|
         .....
       end
     end
   end
  end
end

并且需要这个插件来初始化

config/initializers/delayed_job.rb

require_relative 'path_to_test_plugin'
Delayed::Worker.plugins << Delayed::Plugins::TestHooks

与执行类似,也有成功失败和错误的钩子。

与 'before' 类似,您还可以捕获 'after' 钩子。