如何从delayed_job获取输出,例如PDF / HTML报告

时间:2012-03-07 10:14:34

标签: ruby-on-rails delayed-job

我觉得这是一个愚蠢的问题,因为每个人似乎都在掩饰这方面的事情。

我的需求很简单 - 我在Heroku上使用Ruport运行一些报告。复杂的报告需要很长时间,而且会超时。我决定使用delayed_job - 但我可以使用其他东西。一旦我知道自己在做什么,我也可以将它用于其他事情。

我看到很多例子,轨道广播,关于如何让delayed_job及其兄弟开始运行的文档,如何管理你的工作队列等等。一旦我达到这一点,我可能会有一些问题,但是现在......

我怎么回到排队的工作?

现在,我只是生成如下输出:

@report_output     = @report_controller.render(@report_format,@report_params)
send_data @report_output, :filename => "#{@report_type}.#{@report_format}", :type => "application/#{@report_format}" unless :html == @report_format

(如果它是一个html报告,它只是正常呈现页面)

它在开发中运行良好,在生产中超时。我可以从文档中看到,生成输出并将其邮寄给用户甚至可以很容易,然后我不必担心找回工作。

但我不希望如此。我只想向用户显示进度页面,定期轮询服务器直到完成,然后重定向它们以查看HTML或PDF输出。我希望这可以返回某种工作ID并将其交还给用户,以便他们可以检查它,但我不知道它来自哪里。我想我可以看看桌子,但这看起来很傻。我甚至可以向用户显示排队/完成的作业列表,并让他们手动选择一个,但这太过分了。他们只是想下载一份报告,他们不介意花一两分钟。

我实际上并没有在我的报告中使用表格,没有必要,它们没有被保存 - 但我想如果有帮助的话可以给他们一个表和一个ActiveRecord模型。看起来我不应该这样做。我正在使用Rails 2.3,但它看起来与我的问题无关。

似乎我所要求的是如此明显,没有人费心去写下来,但我似乎无法找到它。有样品应用吗?我错过了什么?我觉得很傻。

2 个答案:

答案 0 :(得分:1)

您可以使用IronWorker等托管后台处理服务(免责声明:我为Iron.io工作)。您可以将作业传递给IronWorker,让工作人员在后台处理作业时更新状态。然后,您可以轮询IronWorker以向用户显示状态以及何时完成更新页面。您还可以使用worker中的回调来在worker和application之间进行同步。很高兴为此提供帮助。

答案 1 :(得分:0)

你在哪里存储ruport生成的结果?如果你把它放在光盘上的某个地方,就像S3存储一样,你可以预先生成报告的名称并将其交还给客户端。如果文件存在,则可以轮询S3存储,然后在创建完成后将其流式传输到客户端。

修改

看起来你在把它放到队列上时会得到这份工作的id:polling with delayed_job