在Rails应用程序启动时队列Sidekiq工作

时间:2013-07-24 15:05:26

标签: ruby-on-rails ruby sidekiq

我需要在我的Rails应用程序启动时向Sidekiq队列添加一个作业,以更新一些数据,但我不知道哪个地方最适合这样做。

现在,我已经在application.rb上写了这个:

class Application < Rails::Application
    config.after_initialize do
        MyWorker.perform_async
    end
end

但问题是当我运行sidekiq命令时它还会加载Rails堆栈,所以我最终会在队列中找到2个作业。

还有其他办法吗?这是我的第一个大Rails应用程序,也是我第一次使用Sidekiq,所以我不知道我是不是正确理解了。这可能不是正确的做法。

谢谢!

3 个答案:

答案 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