Как перезагрузить модель в Sidekiq worker, когда он пытается ссылаться на модель слишком быстро - PullRequest
0 голосов
/ 09 июля 2020

Когда пользователь нажимает кнопку в пользовательском интерфейсе Rails, он запускает воркер, который ищет запись, созданную пользователем. Например, когда пользователь создает «расписание» для запуска в заранее определенное время (иногда сразу), рабочий запускается и пытается найти это расписание, иногда с ошибкой «не удается найти запись».

class TestWorker
    include Sidekiq::Worker
    sidekiq_options queue: Rails.env.to_sym

    def perform(schedule_id)
        begin
            schedule = ScheduledTest.find(schedule_id)
        rescue
            sleep 5 # schedule was just created so needs time to update in db
            TestWorker.perform_async(schedule_id)
            return
        end
    end
end

Это текущий обходной путь. Когда рабочий запускается слишком быстро и не может найти расписание, у меня теперь он снова вызывает сам себя, а затем он работает. Однако похоже, что должен быть способ «перезагрузить» модель, а не перезапускать весь рабочий процесс.

Ответы [ 2 ]

1 голос
/ 10 июля 2020

Вы ищете обратный вызов: after_commit, поэтому задание не будет создано до тех пор, пока транзакция базы данных не будет зафиксирована. -cant-find-modelname-with-id12345-errors-with-sidekiq

0 голосов
/ 09 июля 2020

Один из способов справиться с этим - воспользоваться циклом обратного вызова, предоставляемым ActiveRecord.

after_create приходит на ум: https://apidock.com/rails/ActiveRecord/Callbacks/after_create

Итак, в вашем ScheduleTest модель:

after_create :trigger_worker

def trigger_worker
  TestWorker.perform(id)
end

В качестве альтернативы вы можете позвонить perform_async(id), чтобы выгрузить его в очередь

...