2016-02-23 3 views
3

Попытка реализовать какую-то функцию отмены работы. Для того, чтобы destroy a job with Resque, нужны конкретные аргументы, переданные ему. Похоже, я ошибочно передаю непреднамеренную информацию.ActiveJob с Resque: enqueuing jobs with uninteded arguments

enter image description here

Я ожидаю только значение аргументов, чтобы быть в пределах внешних скобок. Я создаю работу так:

PhysicalServerProvisionJob.perform_later('123')       

Я хотел бы быть в состоянии:.

Resque::Job.destroy(:default, PhysicalServerProvisionJob, '123') 

Однако это не представляется возможным из-за дополнительной информации, переданной в случае, если это неизбежно , есть ли другой способ уничтожить конкретную задание в очереди?

ответ

1

С помощью this answer here, я решил проблему таким образом:

Resque.size('default').times do 
    job = Resque.reserve('default') 
    next if job.nil? || job.args.first['arguments'].first == id 
    Resque.push('default', class: job.payload_class.to_s, args: job.args) 
end 
1

Поскольку Resque::Job.destroy ищет точное соответствие всех аргументов, это не поможет найти класс ActiveJob.

Вот сценарий, я написал для решения этой проблемы:

# Pop jobs off the queue until there are no more 
while job = Resque.reserve('default') 
    # Check this job for the ActiveJob class name we're looking for; 
    # if it does not match, push it back onto a different queue 
    unless job.args.to_s.include?('PhysicalServerProvisionJob') 
    Resque.push('another_queue', class: job.payload_class.to_s, args: job.args) 
    end 
end 
+1

Это не будет работать, если у меня есть более чем одну работу одного и того же класса в одной очереди. – Jerrod

+0

@Jerrod Я думаю, что подход все равно будет работать, вам просто нужно будет добавить дополнительные условия на 'job.args'. В этом примере я только проверяю 'job.args' для имени класса, но вы можете фильтровать на основе чего-либо в этом хеше. – Jared