在所有delyed工作成功回调之前钩住以保存成功完成的工作

时间:2017-01-19 12:48:08

标签: ruby-on-rails ruby ruby-on-rails-4 delayed-job

目的:

保存已成功完成的作业

使用的方法

查看了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'

0 个答案:

没有答案