我需要在我的Rails应用程序启动时向Sidekiq队列添加一个作业,以更新一些数据,但我不知道哪个地方最适合这样做。
现在,我已经在application.rb
上写了这个:
class Application < Rails::Application
config.after_initialize do
MyWorker.perform_async
end
end
但问题是当我运行sidekiq
命令时它还会加载Rails堆栈,所以我最终会在队列中找到2个作业。
还有其他办法吗?这是我的第一个大Rails应用程序,也是我第一次使用Sidekiq,所以我不知道我是不是正确理解了。这可能不是正确的做法。
谢谢!
答案 0 :(得分:6)
更好的解决方案是创建初始值设定项config/initializers/sidekiq.rb
Sidekiq.configure_client do |config|
Rails.application.config.after_initialize do
# You code goes here
end
end
答案 1 :(得分:2)
可能foreman适合您的目的。
答案 2 :(得分:0)
我知道这很旧,但这些都不适合我 - 仍会多次开始这项工作。我想出了以下解决方案:
我有一个班级来完成实际工作:
class InitScheduling
include Sidekiq::Worker
def perform
# your code here
end
end
我有一个初始化器,它通常会启动 3 次,每次都会加载 Rails 环境。所以我使用 Job 作为这个 Job 已经被调度的状态变量:
# code in inizilizer/your_inizilizer.rb
Rails.application.config.after_initialize do
all_jobs = Sidekiq::ScheduledSet.new
# If this is True InitScheduling is already scheduled - don't start it again
unless all_jobs.map(&:klass).include?("InitScheduling")
puts "########### InitScheduling ##############"
# give rails time to build before running this job & keeps this initialization from re-running
InitScheduling.perform_in(5.minutes)
# your code here
end
end