我开发了 RoR应用,使用 resque-status在后台进行一些文件处理。
我希望能够显示后台作业的百分比状态的CSS进度条。
有没有办法从视图中获取作业的状态(实时),以便我可以更改进度条的值?
答案 0 :(得分:2)
我自己一直在考虑这个问题!
您希望使用名为推送技术的内容(与iPhone" Push Notifications"相同)。这将使您能够向您的前端发送特定更新。
让我解释一下这个问题,以及如何解决它......
您遇到的问题是发送持久更新不属于Rails或HTTP的范围。这些都建立在stateless protocol pattern之上,这意味着每个请求都在一个干净的平台上。
这意味着除非您打开持久连接(您可以从中指定不同的数据属性),否则您只能通过asynchronous requests发送一次性更新
<强>持久性强>
为了跟踪进度&#34;,您需要创建一个首先推送您的数据的系统(因此您需要一种接收的方式数据),然后您需要能够处理您将收到的任何推送更新。这就是您将如何创建&#34;外观&#34;进度条。
有两种方法可以实现这一目标:
- SSE's
- Websockets
醇>
这两种工作方式都很简单(你可以在这里看到: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;类型界面,您将要考虑以下模式:
- 您的用户的DOM使用SSE&#ss / Websockets连接到您的终端
- 使用发布/订阅模式,您将为每个用户设置一个频道
- 将推送通知发送到相应的频道
醇>
我建议使用名为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 + "%");
});
显然是一个非常粗略的大纲 - 希望能够解释你如何解决这个问题的方法。