Rails - 延迟作业 - 如何无限期地重新运行方法。

时间:2015-01-12 23:39:07

标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-4 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

1 个答案:

答案 0 :(得分:0)

第一步是让你的Poller作业在每次迭代时检查一些模型属性,寻找一些信号来结束它的循环。而不是试图中断Poller让它完成当前的迭代,但检查它是否应该在循环之前继续。

但是整体上这种模式仍然存在问题,我建议你重新考虑永远循环的后台工作。

  • 此作业将阻止工作人员并阻止该工作人员为当前Poller完成之前为任何其他用户运行Poller
  • 用户可能无法选择或无法发送stop信号,您可能希望在某些限制后仍然停止。
  • 您似乎不太可能想要尽可能快地轮询您正在使用的任何端点。而不是在每次迭代期间旋转工作人员等待,如果该工作人员可以处理其他工作,那将是很好的。

更好的解决方案可能是让您的Poller作业运行一次,然后在轮询完成时将其自身的副本排入队列,如果轮询应该继续。然后,您的工作人员可以交错来自许多用户的Poller个工作。就像上面一样,每个作业都可以检查一些模型状态或方法,以确定它是否应该排队另一个轮询动作。根据您运行这些作业的方式,可能更容易安排将来的迭代,并有一些延迟来限制您的轮询。