2015-02-25 18 views
8

Ho un'applicazione che utilizza Sidekiq. Il processo del server Web a volte inserisce un lavoro su Sidekiq, ma non necessariamente l'esecuzione del worker. Esiste un'utilità che potrei chiamare dalla console Rails che estrae un lavoro dalla coda Redis ed esegue l'operatore Sidekiq appropriato?Come eseguire manualmente un lavoro Sidekiq

+0

fateci sapere quando sapete – user1735921

risposta

0

È possibile eseguire questa operazione utilizzando la classe Sidekiq::Queue nella console di Rails.

Per eseguire un lavoro:

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 

Si noti che questo non influenzerà la coda o le statistiche gestiti da 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}> 

Per eliminare il lavoro che avete appena attizzò dalla parte anteriore della coda:

> 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

Se il lavoro è un mailer, non dimenticate di aggiungere '.deliver' a' klass.send (method, * args) ' –

+0

Questo non funziona. 'queue.first.args [0]' è un hash, quindi perché dovrei chiamare 'YAML.load' su di esso? Inoltre, l'hash non contiene nulla che corrisponda alla tua 'klass, method, args' tuple. –

+0

Come accennato prima, gli argomenti sono un hash, quindi questo non funziona – Mike

0

non vorrei cercare di incidere API sidekiq per eseguire i lavori manualmente dal momento che potrebbe lasciare un po 'interna indesiderati stato, ma credo che il seguente codice funzionerebbe

# 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 

si prega di farmi sapere se questo non funziona o se qualcuno conosce un modo migliore per farlo.

Problemi correlati