2011-03-23 26 views
0

有沒有人在使用蝦時在渲染/構建過程之前啓動文件流的示例?在渲染之前在Rails中傳輸來自蝦/ Prawnto的輸出

這種情況是,我有大約350頁的報告需要大約60秒才能在我自己的工作站上運行,但是當它移動到生產(EC2)時,報告運行時間超過300秒,當它完成時它不會將PDF發送到瀏覽器。

即使60秒很長時間沒有任何用戶反饋,但300即使您等待,也不起作用。我一直在尋找的是在渲染過程之前開始下載文件(我正在使用Prawnto的.pdf.prawn視圖),這樣至少用戶可以在處理過程中看到正在發生的事情,但是如此遠遠無法做到這一點。我發現的所有示例和指南都在渲染完成後開始下載,並在漫長的等待之後開始下載。

如果一切都失敗了,我會看看調度報告,但理想情況下用戶將能夠查看報告,然後返回並進行更改並再次運行,這顯然不允許進行調度。

與Prawnto一起顯示的代碼並不多,因爲它全部只是視圖中的PDF佈局,並且在控制器中通過此調用進行調用。我嘗試了send_file,並將PDF佈局移動到控制器上,以便在沒有Prawnto的情況下運行它,但是所有更改似乎都給出了相同的結果 - 在等待很長時間後,PDF將發送到瀏覽器。

在這一點上我沒有任何想法,並會感激任何想法!

respond_to do |format| 
    format.pdf { 
    prawnto :prawn => {:page_layout => :portrait, :skip_page_creation => true}, :inline => false 
    render :layout => false 
    } 
+0

也許相關的是,我使用乘客進行生產,與Rails 2.3.9和對蝦0.11.1.pre。 – ChriX 2011-03-23 11:34:08

+0

我不確定試圖在300秒內流式傳輸PDF比300秒等待好得多。用戶是否可以觸發異步報告生成,然後在完成後向用戶發送電子郵件通知?或者,您可以將其「分塊」成30-40頁左右的組,並讓用戶選擇一次生成一個部分。 – 2011-03-23 12:38:48

回答

2

如果需要大於60s來生成PDF,您應該考慮將其卸載到後臺工作。推薦使用Delayed :: Job或Resque。

讓工作人員創建PDF並將其保存到磁盤;拋出一個標誌(例如在數據庫或其他內容中)以表明PDF已準備好下載。

這會給您的應用增加一些額外的複雜性,但用戶體驗會大大增強,並且您沒有「描述無法下載PDF」的問題。另外,如果您的應用程序被大量使用,則可以更輕鬆地將PDF創建工作人員卸載到其他服務器。

+0

感謝您的建議。我使用了它們的組合; Delayed :: Job處理完成後,將文檔作爲附件通過電子郵件發送給用戶。 – ChriX 2011-03-23 16:44:14