2
votes

I need to add a job to the Sidekiq queue when my Rails app starts, to update some data, but I don't know where is the best place to do it.

Right now, I've wrote this on my application.rb:

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

But the problem is that when I run the sidekiq command it will also load the Rails stack, so I'll end up with 2 jobs on the queue.

Is there any other way of doing that? This is my first big Rails app and my first time with Sidekiq, so I don't know if I'm not understanding things correctly. That might not be the right way of doing that.

Thanks!

4

4 Answers

8
votes

A better solution would be to create an initializer config/initializers/sidekiq.rb

Sidekiq.configure_client do |config|
    Rails.application.config.after_initialize do
        # You code goes here
    end
end
6
votes

We were having issues w/ Redis connections and multiple jobs being launched.

I ended up using this and it seems to be working well:

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
2
votes

Probably foreman suits for your purposes.

0
votes

I know this is old, but none of this worked for me - would still start the job several times. I came up with the following solution:

I have a Class to do the actual Job:

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

And I have an inizializer, which would normally start 3 Times, every time, something loads the Rails environment. So I use the Job as a state variable that this job is already scheduled:

# 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