为了将
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
感谢 Maxence 为我提供了指导。
Worker 中的perform
,或者 Sidekiq 文档中提到的单个作业,确实被任何继承 ApplicationJob 的作业覆盖,因此意味着 around_perform
回调永远不会被触发。
我已经进入我的 Worker 文件并将方法从
perform
更改为 perform!
,以便可以运行这些回调。