web-dev-qa-db-ja.com

Sidekiqジョブを手動で実行する方法

Sidekiqを使用するアプリケーションがあります。 WebサーバープロセスによってSidekiqにジョブが配置されることがありますが、必ずしもワーカーを実行しているとは限りません。 Railsコンソールから呼び出すことができるユーティリティはありますか?Redisキューから1つのジョブを引き出し、適切なSidekiqワーカーを実行しますか?

15
Jay Godse

これがあなたが望む仕事を得るためにおそらく修正する必要がある方法です(多分 g8M上記の提案 のように)、しかしそれはトリックをするべきです:

> job = Sidekiq::Queue.new("your_queue").first
> job.klass.constantize.new.perform(*job.args)

ジョブを削除する場合:

> job.delete

Sidekiq5.2.3でテスト済み。

8
jhnatr

SidekiqのAPIをハッキングしてジョブを手動で実行しようとはしません。これは、不要な内部状態が残る可能性があるためですが、次のコードは機能すると思います。

# Fetch the Queue
queue = Sidekiq::Queue.new # default queue
# OR
# queue = Sidekiq::Queue.new(:my_queue_name)

# Fetch the job
# job = queue.first
# OR
job = queue.find do |job|
  meta = job.args.first
  # => {"job_class" => "MyJob", "job_id"=>"1afe424a-f878-44f2-af1e-e299faee7e7f", "queue_name"=>"my_queue_name", "arguments"=>["Arg1", "Arg2", ...]}

  meta['job_class'] == 'MyJob' && meta['arguments'].first == 'Arg1'
end

# Removes from queue so it doesn't get processed twice
job.delete

meta = job.args.first
klass = meta['job_class'].constantize
# => MyJob

# Performs the job without using Sidekiq's API, does not count as performed job and so on.
klass.new.perform(*meta['arguments'])

# OR

# Perform the job using Sidekiq's API so it counts as performed job and so on.
# klass.new(*meta['arguments']).perform_now

これがうまくいかない場合、または誰かがこれを行うためのより良い方法を知っている場合は、私に知らせてください。

2
g8M