目的:
保存已成功完成的作业
使用的方法
查看了this answer,其中介绍了如何保存已完成的作业,this answer建议创建一个将在生命周期事件之一后执行的插件。
问题
code中有以下生命周期事件和适用的参数:
:enqueue => [:job],
:execute => [:worker],
:loop => [:worker],
:perform => [:worker, :job],
:error => [:worker, :job],
:failure => [:worker, :job],
:invoke_job => [:job]
我曾预料会有一些事件对应成功,我没有得到哪一项将在工作成功后执行。
部分代码
借助上述两个答案,我创建了这个插件来保存已完成的作业并输入 config / initializers / save_completed_delayed_job.rb
module Delayed
module Plugins
class SaveCompletedDelayedJobPlugin < Plugin
callbacks do |lifecycle|
# see below for list of lifecycle events
lifecycle.after(:perform) do |job|
p "This should be ran after success so that I can save the job in different table"
CompletedDelayedJob.create({
priority: job.priority,
attempts: job.attempts,
handler: job.handler,
last_error: job.last_error,
run_at: job.run_at,
failed_at: job.failed_at,
completed_at: DateTime.now,
queue: job.queue
})
end
end
end
end
end
Delayed::Worker.plugins << Delayed::Plugins::SaveCompletedDelayedJobPlugin
为什么我需要插件
我不能使用回调方法,因为我没有专门的工作分类,我使用以下代码来排队工作。
handle_asynchronously :deliver_delayed, :queue => 'my_q'