我正在使用延迟作业在后台运行特定方法,我需要无限期地继续运行此方法,直到用户停止它为止。我的设置如下:
我的视图中有一个按钮,它按如下方式调用控制器方法:
我的观点:
<%= 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 :(得分:0)
第一步是让你的Poller
作业在每次迭代时检查一些模型属性,寻找一些信号来结束它的循环。而不是试图中断Poller
让它完成当前的迭代,但检查它是否应该在循环之前继续。
但是整体上这种模式仍然存在问题,我建议你重新考虑永远循环的后台工作。
Poller
完成之前为任何其他用户运行Poller
。stop
信号,您可能希望在某些限制后仍然停止。更好的解决方案可能是让您的Poller
作业运行一次,然后在轮询完成时将其自身的副本排入队列,如果轮询应该继续。然后,您的工作人员可以交错来自许多用户的Poller
个工作。就像上面一样,每个作业都可以检查一些模型状态或方法,以确定它是否应该排队另一个轮询动作。根据您运行这些作业的方式,可能更容易安排将来的迭代,并有一些延迟来限制您的轮询。