2012-04-23 21 views
25

Estoy usando trabajadores de Resque para procesar trabajos en una cola, tengo una gran cantidad de trabajos> 1M en una cola y tengo algunos de los trabajos que necesito eliminar (agregados por error). Corregir la cola con los trabajos no fue una tarea fácil, por lo que borrar la cola con resque-web y volver a agregar los trabajos correctos no es una opción para mí.¿Cómo puedo eliminar trabajos específicos de la cola Resque sin borrar toda la cola?

Apreciar cualquier consejo. ¡Gracias!

+0

¿Ha encontrado una solución a esto? ¿Fue muy lento usar destruir? –

Respuesta

21

En las fuentes de resque (clase de empleo) no hay tal método, supongo que es lo que necesita :)

# 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

Si está usando ActiveJob, 'Resque :: Job.destroy' no va a ser útil, revise esta respuesta: http://stackoverflow.com/questions/35589052/activejob-with-resque-enqueuing-jobs -with-ininteded-arguments/40066148 # 40066148 – Jared

18

Para eliminar un trabajo específico de la cola se puede utilizar el método destroy. Es muy fácil de usar, Por ejemplo, si desea eliminar un trabajo con la clase Post y di x, que está en cola denominada cola1 Puede hacer como esto ..

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

Si desea eliminar todo los puestos de trabajo de un tipo particular de una cola puede utilizar

Resque::Job.destroy(QueueName, ClassName) 

usted puede encontrar su documentación en

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

0

Las soluciones anteriores funcionan muy bien si conoce todos los argumentos que se pasaron al trabajo. Si usted tiene una situación donde se sabe que algunos de los argumentos pasados ​​al trabajo de la escritura siguiente funcionará:

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 
Cuestiones relacionadas