Как реализовать обратный вызов «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

perform в родительском классе не выполняется, поскольку дочерний метод уже существует. Может быть, вы можете вызвать set_paper_trail_whodunnit прямо в файле Worker? Я имею в виду последовательно после того, как вы сделали то, что хотите сделать..

Maxence 01.06.2024 23:34

Если вы имеете в виду «работника» и «Иова» как взаимозаменяемые слова, тогда это будет выглядеть примерно так? class ExampleJob < ApplicationJobdef perform(record_id)Record.find(record_id).update!(column: new_value)set_paper_trail_whodunnitendend Я попробовал это, и он не записывает whodunnit, поскольку действие выполняется до вызова set_paper_trail_whodunnit, и поэтому yield внутри него не имеет ничего yield, поэтому PaperTrail не может назначить whodunnit имени задания/работника. Извиняюсь за форматирование

Richard Wright 02.06.2024 05:14
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
107
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

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

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

Другие вопросы по теме