我正在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的情况下,您将那些回调放在哪里?
答案 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_time
,queue_name
等其他功能以及要使用的功能的所有其他方法:callbacks
和{{ 1}}。
旁注:上面的信息用于直接使用hooks
。使用delayed_job
也可以完成上述所有操作。您只需阅读ActiveJob
方式,就可以阅读有关如何操作的文档和指南,就像我已经将您链接到上面的ActiveJob
自述文件一样。