rails ruby-on-rails ruby redis resque

ruby-on-rails - rails - rescue



¿Cómo puedo eliminar trabajos específicos de la cola Resque sin borrar toda la cola? (3)

Estoy utilizando trabajadores de Resque para procesar un trabajo en una cola, tengo un gran número de trabajos> 1M en una cola y tengo algunos de los trabajos que debo eliminar (agregados por error). Crear la cola con los trabajos no fue una tarea fácil, por lo que eliminar la cola mediante resque-web y agregar los trabajos correctos de nuevo no es una opción para mí.

Aprecio cualquier consejo. ¡Gracias!


En las fuentes de resque (clase de trabajo) hay un método de este tipo, supongo que es lo que necesitas :)

# 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)


Las soluciones anteriores funcionan bien si conoce todos los argumentos que se le pasaron al trabajo. Si tiene una situación en la que conoce algunos de los argumentos pasados ​​al trabajo, el siguiente script 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


Para eliminar un trabajo específico de la cola, puede utilizar el método de destrucción. Es muy fácil de usar, por ejemplo, si desea eliminar un trabajo con la clase Publicación e id x, que está en la cola llamada cola1, puede hacerlo así ...

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

Si desea eliminar todos los trabajos de un tipo particular de una cola, puede usar

Resque::Job.destroy(QueueName, ClassName)

Puedes encontrar su documentación en

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