2012-04-23 3 views
25

Utilizzo i dipendenti di Resque per elaborare il lavoro in una coda, ho un numero elevato di lavori> 1 M in una coda e alcuni dei lavori che devo rimuovere (aggiunti per errore). Crating la coda con i lavori non era un compito facile, quindi cancellare la coda usando resque-web e aggiungere di nuovo i lavori corretti non è un'opzione per me.Come posso cancellare lavori specifici dalla coda di Resque senza cancellare l'intera coda?

Apprezzare qualsiasi consiglio. Grazie!

+0

Hai trovato una soluzione a questo? Era molto lento usare distruggere? –

risposta

21

In fonti di Resque (classe Lavoro) c'è tale metodo, immagino che sia quello che ti serve :)

# Removes a job from a queue. Expects a string queue name, a 
# string class name, and, optionally, args. 
# 
# Returns the number of jobs destroyed. 
# 
# If no args are provided, it will remove all jobs of the class 
# provided. 
# 
# That is, for these two jobs: 
# 
# { 'class' => 'UpdateGraph', 'args' => ['defunkt'] } 
# { 'class' => 'UpdateGraph', 'args' => ['mojombo'] } 
# 
# The following call will remove both: 
# 
# Resque::Job.destroy(queue, 'UpdateGraph') 
# 
# Whereas specifying args will only remove the 2nd job: 
# 
# Resque::Job.destroy(queue, 'UpdateGraph', 'mojombo') 
# 
# This method can be potentially very slow and memory intensive, 
# depending on the size of your queue, as it loads all jobs into 
# a Ruby array before processing. 
def self.destroy(queue, klass, *args) 
+0

Se stai usando ActiveJob, 'Resque :: Job.destroy' non sarà utile, dai un'occhiata a questa risposta: http://stackoverflow.com/questions/35589052/activejob-with-resque-enqueuing-jobs -con-uninteded-argomenti/40066148 # 40066148 – Jared

18

Per rimuovere un lavoro specifico dalla coda è possibile utilizzare il metodo destroy. E 'molto facile da usare, Per esempio, se si desidera rimuovere un lavoro con classe di Post e X ID, che è in coda denominata QUEUE1 Si può fare come questo ..

Resque::Job.destroy(queue1, Post, 'x') 

Se si desidera rimuovere tutti i posti di lavoro di tipo particolare da una coda è possibile utilizzare

Resque::Job.destroy(QueueName, ClassName) 

si può trovare è la documentazione a

http://www.rubydoc.info/gems/resque/Resque%2FJob.destroy

0

Le soluzioni di cui sopra funzionano alla grande se si conoscono tutti gli argomenti passati al lavoro. Se si dispone di una situazione in cui si sa alcune degli argomenti passati al lavoro il seguente script funziona:

queue_name = 'a_queue' 
jobs = Resque.data_store.peek_in_queue(queue_name, 0, 500_000); 
deleted_count = 0 

jobs.each do |job| 
    decoded_job = Resque.decode(job) 
    if decoded_job['class'] == 'CoolJob' && decoded_job['args'].include?('a_job_argument') 
    Resque.data_store.remove_from_queue(queue_name, job) 
    deleted_count += 1 
    puts "Deleted!" 
    end 
end 

puts deleted_count