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

Rails - Delayed Job - How to rerun a method indefinitely.

我在后台使用延迟作业 运行 一个特定的方法,我需要无限期地保持 运行ning 这个方法,直到它被用户停止。我的设置如下:

我的视图中有一个按钮调用如下控制器方法:

我的看法:

  <%= 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 方法来 Start checking for new data?另外,我如何通过调用将停止调用 start 方法的方法来允许他们 Stop checking for new data

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

然而,这种模式总体上仍然存在问题,我鼓励您重新考虑永远循环的后台作业。

  • 此作业将阻止工作人员并阻止该工作人员运行为任何其他用户设置 Poller,直到当前 Poller 完成。
  • 用户可能无法选择或无法发送 stop 信号,您可能想在一定限制后停止。
  • 您似乎不太可能真的想尽快轮询您正在使用的任何端点。与其让工人在每次迭代期间等待,不如让该工人能够处理其他工作就好了。

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