在长期运行(Open4)流程的Rails中构建进度指示器

时间:2012-12-12 03:40:10

标签: ruby-on-rails ruby ruby-on-rails-3.2

我将以子弹形式列出这个场景,希望尽可能简化问题的描述。

我正在努力完成以下任务:

  • 用户提交表单,保存记录,然后触发长时间运行的分叉进程
  • 在视图中,用户被重定向(到show动作),用户应该看到所述分叉进程的实时进度指示器。
  • 分叉进程知道记录ID,并且可以在记录已保存的情况下实例化
  • 记录的模型有'status'的attr_accessor
  • 分叉流程的标准输出以我选择的任何增量返回完成百分比

问题:

  • 我无法获取“self.status”或甚至是实例化的“@ record.status”(在open4进程中定义)作用于记录的(show)视图
  • 在用户被重定向到的“show”页面上,尽管forked进程更新了它,但“status”字段值不会更新(假设这是因为该值仅保存在请求中)
  • 在尝试保存到会话变量时,显然“会话”不可用于模型中定义的分叉进程(对此的解决方案看起来真的很hacky)。

问题: 解决这个问题的最佳方法是什么?我假设为长时间运行的进程实现进度指示器是一项非常常见的任务,我只是不确定实现它的最佳方法。我有一些想法使用session [:status]并将其范围限定在模型中,但我想听听一些更好的建议。我还担心这些进程中有很多(100个?)运行的可能性,通过会话跟踪他们的进度是一个好主意吗?也许我应该将有问题的代码移出模型,某处“会话”在范围内?

任何想法都会很棒。 Fyi,在前端我只是计划从ajax请求每隔3秒左右轮询'status'对象。因此,将数据保留在数据库中将是一个非常糟糕的主意。

1 个答案:

答案 0 :(得分:1)

首先,你应该将长时间工作的流程百分比写入Rails缓存,例如Rail.cache.write("#{record_id}_status", 0.1),直到工作完成,执行Rail.cache.write("#{record_id}_status", 1),你可以控制你的百分比处理, 然后,在你的节目页面中,你知道了record_id,在Rails服务器Rails.cache.read("#{record_id}_status")中使用ajax轮询record_id的状态,因此它将知道页面中的百分比