Ruby on rails 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 类应用程序

当我的Rails应用程序启动时,我需要向Sidekiq队列添加一个作业,以更新一些数据,但我不知道在哪里最好

现在,我已经在我的
应用程序.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