2015-02-25 4 views
8

У меня есть приложение, которое использует Sidekiq. Процесс веб-сервера иногда ставит работу на Sidekiq, но я не обязательно буду работать с рабочим. Есть ли утилита, которую я мог бы вызвать из консоли Rails, которая вытащила бы одну работу из очереди Redis и запустила подходящего работника Sidekiq?Как вручную запустить работу Sidekiq

+0

Сообщите нам, когда вы знаете – user1735921

ответ

0

Вы можете сделать это, используя класс Sidekiq::Queue в консоли Rails.

Для выполнения задания:

queue = Sidekiq::Queue.new # access the default queue 
job = queue.first # get the most recent job 
klass, method, args = YAML.load(queue.first.args[0]) # unserialize 
klass.send(method, *args) # run the code that the job would perform 

Обратите внимание, что это не повлияет на очередь или статистику обрабатываемые Sidekiq::Stats.new.

> Sidekiq::Stats.new 
=> #<Sidekiq::Stats:0x007fe7c74db8e8 @stats={:processed=>0, :failed=>0, :scheduled_size=>0, :retry_size=>0, :dead_size=>0, :processes_size=>1, :default_queue_latency=>1056925.2464652061, :workers_size=>0, :enqueued=>1}> 

Чтобы удалить задание, просто ткнул от передней части очереди:

> queue.first.delete 
=> true 

> Sidekiq::Stats.new 
=> #<Sidekiq::Stats:0x007fe7c74db8e8 @stats={:processed=>0, :failed=>0, :scheduled_size=>0, :retry_size=>0, :dead_size=>0, :processes_size=>1, :default_queue_latency=>1056925.2464652061, :workers_size=>0, :enqueued=>0}> 
+0

Если задание является почтовой программой, не забудьте добавить '.deliver' в' klass.send (method, * args) ' –

+0

Это не сработает. 'queue.first.args [0]' is Hash, так почему я должен называть его 'YAML.load'? Кроме того, хеш не содержит ничего, что соответствует вашему набору 'klass, method, args'. –

+0

Как уже упоминалось ранее, аргументы являются хешем, поэтому это не работает – Mike

0

я бы не пытаться взломать API sidekiq для запуска задания вручную, так как это может оставить некоторые нежелательные внутренние состояние, но я считаю, что следующий код будет работать

# 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 

Пожалуйста, дайте мне знать, если это не работает, или если кто-то знает лучший способ сделать это.

Смежные вопросы