Ruby on Rails 4 resque-status进度条

时间:2014-09-02 04:57:19

标签: css ruby-on-rails ruby ruby-on-rails-4 resque-status

我开发了 RoR应用,使用 resque-status在后台进行一些文件处理。

我希望能够显示后台作业的百分比状态的CSS进度条。

有没有办法从视图中获取作业的状态(实时),以便我可以更改进度条的值?

1 个答案:

答案 0 :(得分:2)

我自己一直在考虑这个问题!


Push

您希望使用名为推送技术的内容(与iPhone" Push Notifications"相同)。这将使您能够向您的前端发送特定更新。

让我解释一下这个问题,以及如何解决它......

您遇到的问题是发送持久更新不属于Rails或HTTP的范围。这些都建立在stateless protocol pattern之上,这意味着每个请求都在一个干净的平台上。

这意味着除非您打开持久连接(您可以从中指定不同的数据属性),否则您只能通过asynchronous requests发送一次性更新


<强>持久性

为了跟踪进度&#34;,您需要创建一个首先推送您的数据的系统(因此您需要一种接收的方式数据),然后您需要能够处理您将收到的任何推送更新。这就是您将如何创建&#34;外观&#34;进度条。

有两种方法可以实现这一目标:

  
      
  1. SSE's
  2.   
  3. Websockets
  4.   

这两种工作方式都很简单(你可以在这里看到:What are Long-Polling, Websockets, Server-Sent Events (SSE) and Comet?

它们基本上使您能够将前端DOM(通过JS)连接到后端&#34; push&#34;系统。这将允许您的JS处理从您的后端发送到您的&#34; listen&#34;的任何更新。 JS打电话。

除了说websockets是最好的解决方案之外,我不会详细讨论SSE / Websockets,它们确实是持久的。 SSE只是对您的controller endpoint使用ajax长轮询,效率极低且非常低效。安全性较低。

-

<强>推

为了实现&#34;进度条&#34;类型界面,您将要考虑以下模式:

  
      
  1. 您的用户的DOM使用SSE&#ss / Websockets连接到您的终端
  2.   
  3. 使用发布/订阅模式,您将为每个用户设置一个频道
  4.   
  5. 将推送通知发送到相应的频道
  6.   

我建议使用名为Pusher的系统(没有联属关系)。它是一个websocket接口,将您的前端连接到系统的后端控制器方法

这将允许您执行以下操作:

#app/assets/stylesheets/application.css.sass
.progress
   background: #ccc
   .bar
      background: #f0f

#app/workers/your_job_worker.rb
class YourJobWorker
  include Resque::Plugins::Status

  def perform
    # send update to pusher here
  end

end

#app/assets/javascripts/application.js
var pusher = new Pusher('***');
var channel = pusher.subscribe('*****');
channel.bind('progress', function(data) {
    $(".bar .progress").css("width", data + "%");
});

显然是一个非常粗略的大纲 - 希望能够解释你如何解决这个问题的方法。