Ruby on rails Rails应用程序启动上的队列Sidekiq作业
当我的Rails应用程序启动时,我需要向Sidekiq队列添加一个作业,以更新一些数据,但我不知道在哪里最好 现在,我已经在我的Ruby on rails Rails应用程序启动上的队列Sidekiq作业,ruby-on-rails,ruby,sidekiq,Ruby On Rails,Ruby,Sidekiq,当我的Rails应用程序启动时,我需要向Sidekiq队列添加一个作业,以更新一些数据,但我不知道在哪里最好 现在,我已经在我的应用程序.rb上写了这个: class Application < Rails::Application config.after_initialize do MyWorker.perform_async end end 类应用程序
应用程序.rb上写了这个:
class Application < Rails::Application
config.after_initialize do
MyWorker.perform_async
end
end
类应用程序
但问题是,当我运行sidekiq
命令时,它还将加载Rails堆栈,因此我将在队列中得到2个作业
还有别的方法吗?这是我的第一个大型Rails应用程序,也是我第一次使用Sidekiq,所以我不知道我是否理解错误。这可能不是正确的做法
谢谢 可能适合您的目的。更好的解决方案是创建一个初始值设定项config/initializers/sidekiq.rb
Sidekiq.configure_client do |config|
Rails.application.config.after_initialize do
# You code goes here
end
end
我们在Redis连接和多个作业启动方面遇到了问题
我最终使用了这个,它似乎工作得很好:
if defined?(Sidekiq)
Sidekiq.configure_server do |config|
config.on(:startup) do
already_scheduled = Sidekiq::ScheduledSet.new.any? {|job| job.klass == "MyWorker" }
MyWorker.perform_async unless already_scheduled
end
end
end
我知道这已经很老了,但这些都对我不起作用——我仍然会开始工作好几次。我提出了以下解决方案:
我有一个班来做实际的工作:
class InitScheduling
include Sidekiq::Worker
def perform
# your code here
end
end
我有一个序列化程序,它通常会启动3次,每次有东西加载Rails环境。因此,我将作业用作已计划此作业的状态变量:
# 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