如何在不清除整个队列的情况下从 Resque 队列中删除特定作业?

Posted

技术标签:

【中文标题】如何在不清除整个队列的情况下从 Resque 队列中删除特定作业?【英文标题】:How can I delete specific jobs from Resque queue without clearing the whole queue? 【发布时间】:2012-05-03 17:39:35 【问题描述】:

我正在使用 Resque 工作人员处理队列中的作业,队列中有大量 > 1M 的作业,并且有一些需要删除的作业(错误添加)。使用作业创建队列并非易事,因此使用 resque-web 清除队列并再次添加正确的作业对我来说不是一个选项。

感谢任何建议。谢谢!

【问题讨论】:

您找到解决方案了吗?用destroy是不是很慢? 【参考方案1】:

要从队列中删除特定作业,您可以使用 destroy 方法。它非常易于使用, 例如,如果您想删除一个具有 Post 类和 id x 的作业,该作业位于名为 queue1 的队列中 你可以这样做..

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

如果您想从队列中删除所有特定类型的作业,您可以使用

Resque::Job.destroy(QueueName, ClassName) 

您可以在以下位置找到它的文档

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

【讨论】:

【参考方案2】:

在 resque 的源(Job 类)中有这样的方法,猜猜它是你需要的:)

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

【讨论】:

如果您使用 ActiveJob,Resque::Job.destroy 不会有帮助,请查看此答案:***.com/questions/35589052/…【参考方案3】:

如果您知道传递给作业的所有参数,上述解决方案将非常有效。如果您知道 一些 传递给作业的参数,则以下脚本将起作用:

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

【讨论】:

以上是关于如何在不清除整个队列的情况下从 Resque 队列中删除特定作业?的主要内容,如果未能解决你的问题,请参考以下文章

如何在不重复单词并遍历整个数组的情况下从数组中随机播放文本? (迅速)

PHP的轻量消息队列php-resque使用说明

php-resque 简单的php消息队列

PHP-RESQUE重试机制

Resque作业,如何停止正在运行的作业

如何在不使用 dispatch_get_current_queue() 的情况下验证我是不是在给定的 GCD 队列上运行?