0

Я использую задержанную работу для запуска определенного метода в фоновом режиме, и мне нужно продолжать использовать этот метод неограниченно, пока пользователь не остановится. Я этот набор следующим образом:Rails - Delayed Job - как повторно запустить метод на неопределенный срок.

У меня есть кнопка, на мой взгляд, который вызывает метод контроллера следующим образом:

Мое мнение:

<%= form_tag(:controller => 'home', :action => 'start') do %> 
    <%= submit_tag "Start Checking for new Data", :class => "btn btn-success btn-lg btn-start" %> 
    <% end %> 

Мой контроллер:

def start 
    if current_user 
     begin 
     Poller.delay.do_something(client) 
     flash[:notice] = 'Polling Started' 
     rescue 
     flash[:error] = 'Issue connecting to API. Please try again later.' 
     end 
     redirect_to :back 
    end 
    end 

Как я могу разрешить пользователю Start checking for new data путем вызова метода start снова и снова? Кроме того, как я могу разрешить их Stop checking for new data, вызвав метод, который перестанет вызывать метод start?

ответ

0

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

Однако все еще есть проблемы с этим шаблоном в целом, и я призываю вас пересмотреть фоновые задания, которые работают навсегда.

  • Эта работа будет блокировать рабочий и предотвратить, что работнику не работает Poller для любого другого пользователя до текущей Poller отделки.
  • Пользователь не может выбирать или быть в состоянии отправить сигнал stop, вы, вероятно, захотите остановиться в любом случае после некоторого ограничения.
  • Кажется маловероятным, что вы действительно хотите опросить любую конечную точку, которую используете, как можно быстрее. Вместо того, чтобы вращать рабочего, ожидающего во время каждой итерации, было бы неплохо, если бы этот рабочий был доступен для обработки других заданий.

Лучшее решение может заключаться в том, что задание Poller запускается один раз, а затем завершает копию самой копии, когда она заканчивается, если опрос должен продолжаться. Затем ваш работник может чередовать Poller рабочих мест у многих пользователей. Как и выше, каждое задание может проверять состояние модели или метод, чтобы определить, должно ли оно входить в другое действие опроса или нет. В зависимости от того, как вы выполняете эти задания, также может быть проще запланировать будущие итерации с некоторой задержкой, чтобы активировать ваш опрос.

Смежные вопросы