当 Sidekiq worker 试图过快地引用模型时如何在它中重新加载模型
How to reload a model in Sidekiq worker when it tries to reference the model too fast
当用户单击 Rails UI 中的按钮时,它会触发一个工作程序查找用户创建的记录。例如,当用户创建一个“计划”以在预定义的时间(有时是立即)开始时,工作人员将被启动并尝试找到该计划,有时会因“找不到记录”错误而失败。
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
这是当前的解决方法。当 worker 启动太快而找不到调度时,我现在让它再次调用自己,然后它就可以工作了。但是,似乎应该有一种方法可以“重新加载”模型而不是重新启动整个工作人员。
处理此问题的一种方法是利用 ActiveRecord
提供的回调周期。
after_create
来到mind:https://apidock.com/rails/ActiveRecord/Callbacks/after_create
因此在您的 ScheduleTest
模型中:
after_create :trigger_worker
def trigger_worker
TestWorker.perform(id)
end
或者,您可以调用 perform_async(id)
将其转储到队列中
您正在寻找 :after_commit 回调,因此在提交数据库事务之前不会创建作业。
当用户单击 Rails UI 中的按钮时,它会触发一个工作程序查找用户创建的记录。例如,当用户创建一个“计划”以在预定义的时间(有时是立即)开始时,工作人员将被启动并尝试找到该计划,有时会因“找不到记录”错误而失败。
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
这是当前的解决方法。当 worker 启动太快而找不到调度时,我现在让它再次调用自己,然后它就可以工作了。但是,似乎应该有一种方法可以“重新加载”模型而不是重新启动整个工作人员。
处理此问题的一种方法是利用 ActiveRecord
提供的回调周期。
after_create
来到mind:https://apidock.com/rails/ActiveRecord/Callbacks/after_create
因此在您的 ScheduleTest
模型中:
after_create :trigger_worker
def trigger_worker
TestWorker.perform(id)
end
或者,您可以调用 perform_async(id)
将其转储到队列中
您正在寻找 :after_commit 回调,因此在提交数据库事务之前不会创建作业。