如何使用 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_time
、queue_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' 钩子。
我在 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_time
、queue_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' 钩子。