如何在 ApplicationJob 中包含 Sidekiq (Sidekiq::Job) 后实现 `around_perform` 回调

问题描述 投票:0回答:1

为了将

Sidekiq::Job
的继承简化到我的所有工作中,并尝试利用 Rails 的内置回调,我实现了
ApplicationJob
,如 this 来记录
whodunnit
数据(我还删除了继承来自
ActiveJob::Base
来自
ApplicationJob
因为它冲突:

class ApplicationJob
  include Sidekiq::Job
  extend ActiveModel::Callbacks

  sidekiq_options queue: :default

  define_model_callbacks :perform

  around_perform :set_paper_trail_whodunnit

  def set_paper_trail_whodunnit
    PaperTrail.request.whodunnit = self.class.name
    yield
  ensure
    PaperTrail.request.whodunnit = nil
  end

  def perform(*args)
    run_callbacks(:perform) do
      perform!(*args)
    end
  end

  def perform!(*_args)
    raise NotImplementedError, 'Missing your #perform! method implementation'
  end
end

现在每个作业都应该像这样继承,同时还记录 PaperTrail whodunnit:

class ExampleJob < ApplicationJob
  def perform(record_id)
    Record.find(record_id).update!(column: new_value)
  end
end

然而最终发生的情况是,

around_perform
回调永远不会到达,永远不会触发,因此,
whodunnit
永远不会正确设置。

我尝试通过以下方式手动继承

around_perform
中的
ApplicationJob

extend ActiveJob::Callbacks

或通过:

extend ActiveJob::Callbacks::ClassMethods

但这也永远不会触发。或者当我在内部包含断点时到达

set_paper_trail_whodunnit

ruby-on-rails callback sidekiq rails-activejob paper-trail-gem
1个回答
0
投票

感谢 Maxence 为我提供了指导。

Worker 中的

perform
,或者 Sidekiq 文档中提到的单个作业,确实被任何继承 ApplicationJob 的作业覆盖,因此意味着
around_perform
回调永远不会被触发。

我已经进入我的 Worker 文件并将方法从

perform
更改为
perform!
,以便可以运行这些回调。

© www.soinside.com 2019 - 2024. All rights reserved.