2

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

现在,我已经在我的application.rb:

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

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

有没有其他方法可以做到这一点?这是我的第一个大型 Rails 应用程序,也是我第一次使用 Sidekiq,所以我不知道我是否理解不正确。这可能不是正确的做法。

谢谢!

4

4 回答 4

9

更好的解决方案是创建一个初始化程序config/initializers/sidekiq.rb

Sidekiq.configure_client do |config|
    Rails.application.config.after_initialize do
        # You code goes here
    end
end
于 2014-12-04T09:48:21.980 回答
6

我们遇到了 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
于 2016-08-15T22:37:57.780 回答
2

可能工头适合您的目的。

于 2013-07-24T15:27:45.817 回答
0

我知道这已经过时了,但这些都不适合我——仍然会开始工作几次。我想出了以下解决方案:

我有一个班级来做实际的工作:

class InitScheduling
  include Sidekiq::Worker
  def perform
    # your code here
  end
end

我有一个初始化程序,它通常会启动 3 次,每次都会加载 Rails 环境。因此,我使用 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
于 2021-05-05T11:41:20.400 回答