2011-05-04 25 views
30

Estoy usando Resque en un proyecto de rails-3 para manejar trabajos que están programados para ejecutarse cada 5 minutos. Hace poco hice algo que hizo crecer la creación de estos trabajos y la pila ha golpeado más de 1000 trabajos. Solucioné el problema que causó que muchos trabajos se pusieran en cola y ahora el problema que tengo es que los trabajos creados por el error siguen ahí y, por lo tanto, es difícil probar algo, ya que un trabajo se agrega a una cola con más de 1000 trabajos. Parece que no puedo detener estos trabajos. He intentado eliminar la cola del redis-cli usando el comando flushall pero no funcionó. ¿Me estoy perdiendo de algo? Porque parece que no puedo encontrar una manera de deshacerme de estos trabajos.¿Cómo destruir los trabajos puestos en cola por los trabajadores de resque?

Respuesta

39

Si usted hace estallar abrir una consola de rieles, se puede ejecutar el código para limpiar la cola (s):

queue_name = "my_queue" 
Resque.redis.del "queue:#{queue_name}" 
+4

Como se encuentra en la respuesta de @ denmarkin a continuación, use Resque.redis.del en lugar de Resque.redis.delete –

51

Jugar fuera de las respuestas anteriores, si es necesario borrar todos sus colas, se puede utilizar el siguiente:

Resque.queues.each{|q| Resque.redis.del "queue:#{q}" } 
+0

¡Funciona de maravilla! Gracias – Trip

30

Resque ya tiene un método para hacer esto - es y Resque.remove_queue(queue_name) (consulte la documentación here). Internamente, realiza Resque.redis.del(), pero también realiza otras tareas de limpieza, y al usar un método api (en lugar de hacer suposiciones sobre cómo funciona resque), estará más preparado para el futuro.

+0

El uso de la API Resque es un mejor enfoque – grant

11

Esto es lo que funciona ahora:

Resque.remove_queue("...") 
+0

Sí, parece ser la forma correcta de hacerlo: http://www.rubydoc.info/gems/resque/1.27.4/Resque#remove_queue-instance_method – jwadsack

3

Introduzca consola Redis:

redis-cli 

bases de datos de lista:

127.0.0.1:6379> KEYS * 
1) "resque:schedules_changed" 
2) "resque:workers" 
3) "resque:queue:your_overloaded_queue" 

"resque:queue:your_overloaded_queue" - dB, lo que necesita.

A continuación, ejecute:

DEL resque:queue:your_overloaded_queue 

O si desea eliminar los trabajos especificados en la cola a continuación una lista de algunos valores de dB con LRANGE comando:

127.0.0.1:6379> LRANGE resque:queue:your_overloaded_queue 0 2 
1) "{\"class\":\"AppClass\",\"args\":[]}" 
2) "{\"class\":\"AppClass\",\"args\":[]}" 
3) "{\"class\":\"AppClass\",\"args\":[]}" 

luego copiar/pegar un valor a LREM comando :

127.0.0.1:6379> LREM resque:queue:your_overloaded_queue 5 "{\"class\":\"AppClass\",\"args\":[]}" 
(integer) 5 

Donde 5 - número de elementos a eliminar .

+0

Redis recomienda que [no ejecuta 'KEYS *' en una base de datos de producción] (https://redis.io/commands/keys) mientras escanea todo el conjunto de claves y bloquea todos los registros. Esto podría afectar negativamente a sus trabajadores de segundo plano en un sistema muy ocupado. – jwadsack

Cuestiones relacionadas