Как реализовать обратный вызов «around_perform» после включения Sidekiq (Sidekiq::Job) внутри ApplicationJob

Чтобы упростить наследование Sidekiq::Job во всех моих заданиях и в качестве попытки использовать встроенные обратные вызовы Rails, я реализовал ApplicationJob типа это для регистрации 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 предоставляет множество готовых решений для обработки типичных задач, таких как маршрутизация и работа с базой данных.


107
1

Ответ:

Решено

Спасибо Максенсу, который дал мне инициативу.

perform в Worker или отдельном задании, как оно упоминается в документации Sidekiq, действительно перезаписывалось любым заданием, наследующим ApplicationJob, что означало, что обратный вызов around_perform никогда не запускался.

Я заглянул в свои рабочие файлы и изменил там методы с perform на perform!, чтобы эти обратные вызовы можно было запускать.