如何销毁由Resque工作者排队的作业?

42

我在一个rails-3项目中使用Resque来处理每5分钟运行的任务。最近我做了一些导致这些任务数量不断增加的事情,导致堆栈中积累了超过1000个任务。我解决了导致这么多任务排队的问题,但现在我面临的问题是由错误创建的任务仍然存在,因此测试变得困难,因为一个队列中有1000多个任务。 我似乎无法停止这些任务。我尝试使用flushall命令从redis-cli中删除队列,但它没有起作用。我错过了什么吗?因为我似乎找不到摆脱这些任务的方法。

7个回答

71

参考以上回答,如果您需要清除所有队列,可以使用以下命令:

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

51

如果你打开Rails控制台,可以运行以下代码来清空你的队列:

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

4
如下所述,根据@denmarkin的回答,使用Resque.redis.del而不是Resque.redis.delete。 - James P McGrath

36

Resque已经有一个进行此操作的方法 - 尝试使用Resque.remove_queue(queue_name)(在这里查看文档here)。内部它执行Resque.redis.del(),但它还要进行其他清理,并且通过使用api方法(而不是假设resque的工作方式),您将更具未来性。


使用 Resque API 是更好的方法。 - grant

14

14

这是目前有效的方法:

Resque.remove_queue("...")

是的,这似乎是正确的方法:http://www.rubydoc.info/gems/resque/1.27.4/Resque#remove_queue-instance_method - jwadsack

5
使用Resque API比在Resque的Redis上删除所有内容更加安全可靠。Resque内部会进行一些清理工作。
如果您想要删除所有队列和相关的已排队作业:
Resque.queues.each {|queue| Resque.remove_queue(queue)}

下次作业入队时,队列将重新创建。

文档


4

进入Redis控制台:

redis-cli

列出数据库:
127.0.0.1:6379> KEYS *
 1) "resque:schedules_changed"
 2) "resque:workers"
 3) "resque:queue:your_overloaded_queue"

"

"resque:queue:your_overloaded_queue"是需要的数据库。

然后运行:

"
DEL resque:queue:your_overloaded_queue

如果您想要从队列中删除指定的作业,则使用LRANGE命令从数据库中列出几个值:

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\":[]}"

然后将一个值复制/粘贴到LREM命令中:

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

这里的“5”是需要移除的元素数量。


1
Redis建议您不要在生产数据库上运行KEYS *命令(https://redis.io/commands/keys),因为它会扫描整个键集并锁定所有记录。这可能会对非常繁忙的系统上的后台工作人员产生不利影响。 - jwadsack

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接