#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
поскольку параметр ОЧЕРЕДИ использует порядок строк, разделенных запятыми, для определения приоритета.