2012-03-07 51 views
3

我覺得這是一個愚蠢的問題,因爲每個人似乎都在關注這方面的事情。如何從delayed_job獲得輸出,例如PDF/HTML報告

我的需要很簡單 - 我運行在Heroku上使用Ruport一些報道。複雜的報告需要很長時間,並且他們超時。我決定使用delayed_job - 但我可以使用別的東西。一旦我知道我在做什麼,我也可以用它來做其他事情。

我看到很多示例,railscasts,關於如何獲得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,但它看起來不像我的問題。

好像什麼我問的是如此明顯,沒有一個一直困擾着把它寫下來,但我似乎無法找到它。是否有示例應用程序?我錯過了什麼?我感到愚蠢。

回答

0

你在哪裏存儲ruport世代的結果?如果你把它放在光盤上的某個地方,比如一個S3存儲器,你可以預先生成你的報告的名字,然後把它交給客戶端。如果文件存在,您可以輪詢S3存儲,然後在創建完成後將其傳輸到客戶端。

編輯

看起來你把它當隊列取回作業的ID:polling with delayed_job

+0

嗯,是的,我可以 - 這就是我的意思,「我想可以給他們一個表和一個ActiveRecord模型,如果有幫助的話」 - 我可以生成一個ReportGen記錄,將這個ID新記錄,將狀態和文件名存儲在那裏,然後用戶可以進行輪詢。 (a)聽起來不僅僅是我應該做的事情,而且(b)爲什麼我找不到其他人做任何類似的示例代碼? 我希望這個記錄有這種工作的某種ID號,所以我可以在晚些時候殺死/清理掛起的工作?我從哪裏得到這些信息,爲什麼我不能把它交回來? – 2012-03-07 21:07:32

1

你可以使用像聯合衝剪機(免責聲明託管後臺處理服務:我的除鐵作業。 IO)。您可以將作業傳遞給IronWorker,讓工作人員在後臺處理作業時更新狀態。然後,您可以輪詢IronWorker以向用戶顯示狀態,並在完成時更新頁面。您還可以使用工人的回調在工作人員和應用程序之間進行同步。樂於爲此提供幫助。

+0

是否有一些示例代碼顯示如何做到這一點? – 2012-03-09 00:49:24

+1

Hi @ stephan.com,這裏的示例應用程序顯示如何設置和獲取進度:https://github.com/iron-io/heroku_sinatra_example 請參閱tweet_worker.rb瞭解它如何設置它以及如何設置hello.rb得到它。 hello.erb中有一些ajax顯示瞭如何在UI中顯示它。 – 2012-04-03 08:10:26