Как динамически поставить задание в очередь в задании в Rails?

У меня есть задание, и когда задание запускается, в самом низу, и я хочу enqueue снова запустить одно и то же задание через 1 час, но с другими аргументами.

Что я достиг до сих пор:

class SimpleJob
  @queue = :normal

  def self.perform(start)
    puts "Right now, start = #{start}"
    start += 12
    time = some_request_external_api
    self.set(wait: time).perform_later(start)
  end
end

Я использую гем resque и запускаю задание через QUEUE=* rake resque:work. Конечно, сначала печатает Right now, start = 12, но дальше ничего не происходит. Как именно я могу реализовать эту функциональность?


person Arslan Ali    schedule 23.06.2016    source источник


Ответы (2)


Вместо того, чтобы снова ставить задание в очередь внутри себя, вы можете использовать планировщик, такой как clockwork.

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

Они будут отправлять post запросов на желаемое действие всякий раз, когда какое-либо действие происходит на их стороне.

person Jawad Khawaja    schedule 24.06.2016
comment
Хороший вопрос, но вот в чем дело: я не знаю заранее, когда именно планировать работу. Я обращался к внешнему API и в ответ на этот вызов решал, когда запускать следующее задание. В общем, я хотел бы иметь функциональность, которая позволяла бы мне планировать задания динамически, а не планировать с заранее определенными значениями. - person Arslan Ali; 24.06.2016
comment
Если вы взаимодействуете с API, и указанный API позволяет вам настроить действие веб-перехватчика для получения событий, какое бы действие ни происходило на их стороне, будь то из-за вызова из вашего приложения или автоматически, в идеале вы должны получать обновленный объект через веб-перехватчик. . Затем вы можете вместо этого запустить свою работу в этом действии. Не было бы необходимости планировать его или ставить в очередь внутри самого себя. - person Jawad Khawaja; 24.06.2016

Похоже, вы ищете способы настроить повторяющуюся работу. Если это так, взгляните на это:

https://github.com/resque/resque-scheduler

person San    schedule 23.06.2016
comment
Я посмотрел на это, но то, что я хочу, это что-то другое. Я хочу запустить задание, и в конце оно запустится само. Не могли бы вы включить немного кода для того, чтобы реализовать указанную функциональность с помощью resque-scheduler? - person Arslan Ali; 24.06.2016