В Resque есть ли способ переместить задание в начало очереди?

#resque

#resque

Вопрос:

У меня есть задание в очереди, которое имеет более высокий приоритет, чем другие задания в этой очереди. Есть ли в Resque механизм, с помощью которого я могу переместить это задание в начало очереди?

Ответ №1:

Если это ошибка adhoc, вы можете использовать redis из консоли ruby / rails как

 class_looking_for = "MyWorker"
args_looking_for = [1234, {"foo" => "bar"}]
queue = "foo"
redis = Resque.redis
key = "queue:#{queue}"

redis.llen(key).times do |n|
  value = redis.lindex(key, n)
  job = Resque.decode(value)
  if job["class"] == class_looking_for amp;amp; job["args"] == args_looking_for
    redis.lrem(key, value)
    redis.lpush(value)
    break
  end
end
  

Это будет перебирать ключи в списке redis, используемом redis для сохранения заданного queue , и проверять, соответствует ли оно заданному class_looking_for , и args_looking_for настраивать фильтр в соответствии с вашими потребностями ( job выглядит так {"class"=>"PieCutWorker", "args"=>[42529, "heart shape"]} ), как только будет найдено нужное задание, оно будет удалено из очереди, а затем добавлено к нему. Затем оно готово к передаче следующему доступному работнику.

Но, если вам это нужно как системное правило, as job "X" always needs to run right away , тогда вам лучше создать новую очередь для этого задания и либо инициализировать redis workers как

 $ QUEUE=important,something,bulk rake resque:work
  

поскольку параметр ОЧЕРЕДИ использует порядок строк, разделенных запятыми, для определения приоритета.