ruby-on-rails - 如何使用钩子/回调创建延迟作业作业?
问题描述
我在 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 回调,你把这些回调放在哪里?
解决方案
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
上面的自述文件一样。
推荐阅读
- asp.net-core - 如何从asp.net核心中的视图重定向到另一个视图
- python - 使用打印功能的三元运算符
- javascript - 如何根据 ReactJS 中的 JSON 键值导入/添加多个图像?
- r - 用于循环日期
- python - 如何在 yfinance 中使用加拿大股票代码?
- android - 将预填充的数据库导入 android 应用程序
- node.js - 您能否轻松解释使用节点后端部署离子(基于反应)应用程序的过程?
- python - 为什么uuid4的生成比uuid1快?
- kubernetes - GKE 指标服务器生成错误 - flag.Parse: E0907
- docker - Docker 中的 Identity Server 4 使用 OIDC 和 Selenium 测试