Как удалить определенные задания из очереди Resque, не очищая всю очередь?
Я использую Resque для обработки задания в очереди, у меня есть большое количество заданий > 1M в очереди и некоторые из заданий, которые мне нужно удалить (добавлено по ошибке). Уборка очереди с заданиями была непростой задачей, поэтому очистка очереди с использованием resque-web и добавление правильных заданий снова не для меня.
Оцените любые советы. Благодарю!
Ответы
Ответ 1
В источниках resque (класс работы) есть такой метод, угадайте, что вам нужно:)
# 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)
Ответ 2
Чтобы удалить конкретное задание из очереди, вы можете использовать метод 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
Ответ 3
Вышеупомянутые решения отлично работают, если вы знаете все аргументы, переданные заданию. Если у вас есть ситуация, когда вы знаете некоторые аргументы, переданные заданию, будет работать следующий script:
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