Rails 3 + delayed_job:如何跟踪任务的进度(例如着陆页上的进度条)?

时间:2011-01-05 03:04:36

标签: jquery ruby-on-rails-3 progress-bar delayed-job

Delayed_job终于为我工作了(使用RoR3中的collectiveidea gem)来执行几项任务。第一种是管理员将图像的zip文件上传到图库并提取每个图像以构建属于该图库的照片对象。第二是删除画廊。这些画廊可能相当大(约3分钟内有550张照片),我希望能够显示画廊仍在处理中或排队等待删除,即使它没有完全显示。

现在,我只是使用默认技术(@ gallery.delay.extract_photos和@ gallery.delay.destroy)。

当管理员点击提取链接时,他们会被定向到图库页面(这是空的),并带有一条flash消息,告诉他们正在处理图库。定期刷新页面会显示截至该点已提取的图像列表。但是,作业完成时并不完全清楚,因为刷新一旦清除了flash消息。基本上,我希望能够显示一个进度条,每隔一秒左右更新一次,并在其旁边显示数量进度([====== ] 33/86)和/或更新图库以显示添加后的图像。

删除大型画廊也需要花费很多时间,所以我也希望将其作为延迟工作。但是,当您删除它后进入登录页面时,图库仍然存在,因此它会在完全消失之后显示,直到刷新之后。我希望有一种方法可以将其标记为排队等待删除或显示进度条,并在删除完成后消失。

我一直在寻找RoR3 AJAX帮助,但我似乎找到的所有内容都是针对2.3.8并且已被弃用。此外,我需要知道如何跟踪作业是否仍在执行,而且我还没有注意到集体内容的文档。我想,因为作业存储在一个表中,也许我可以使用DelayedJob.thisjob.exists跟踪它?或类似的东西,但在rails控制台中尝试DelayedJob.all只是给了我错误(即使在作业运行时)。

总而言之,我的问题是:如何跟踪延迟的作业并在视图中以任何方式显示它的进度? [edit] 我知道我可以在图库页面上进行主动轮询,但我不希望一直发生这种情况 - 只是在作业执行(或计划)时。有没有办法测试正在执行或计划执行的作业的存在?因为我没有找到在视图中跟踪它的方法。

感谢。

2 个答案:

答案 0 :(得分:3)

部分回应......

  

有没有办法测试   存在的工作正在存在   执行或计划执行   执行?

您可以使用

Delayed::Job 

获取队列中的Active Record作业及其状态。

Delayed::Job.find :all , :conditions=>"locked_at IS NOT NULL"

我建议您使用resque来对流程进行细粒度控制。

答案 1 :(得分:1)

您是否可以选择使用Nginx及其上传模块?我希望如此,因为这会提高整体应用的性能。查看Gautam Rege撰写的这篇博客文章,他使用Nginx,Rails和Delayed Job进行相对较大的上传:

http://blog.joshsoftware.com/2010/10/20/uploading-multiple-files-with-nginx-upload-module-and-upload-progress-bar/

帖子没有提及他是否使用Rails 3,但由于Nginx正在处理上传,因此没有很多Rails代码,你应该能够在必要时进行调整。