2011-12-14 55 views
6

這是我製作的previous post的擴展。Play Framework:通過作業使用Highcharts JS庫的PDF模板

總結是怎麼回事:

  • 我使用的被執行每小時的作業,會生成一個PDF發送作爲電子郵件的附件
  • 作業不做的很多,但直接調用控制器來生成PDF併發送電子郵件。由於我使用的PDF模塊(當前)需要HTTP請求作爲其PDF處理的一部分,因此我稱之爲控制器來完成這項工作。這裏是我如何通過Job調用控制器:

    WS.url(「my/url/that/points/to/the/controller」)。get();

  • 我以前用PDF格式包含一張highcharts JS圖表的模板是,它生成了圖表客戶端,這對於PDF生成來說已經太晚了,因此我的PDF生成了減去圖表。爲了解決這個問題,我現在用highcharts-serverside-export生成圖表服務器端

如果我使用相同的類以上,並呈現在瀏覽器中的模板(即通過控制器直接去,而忽略工作) ,圖表被創建服務器端並且視圖在瀏覽器中正確呈現。

<img src="@{ChartGenerator.go()}"> 

的ChartGenerator控制器基本上只是建立在圖表服務器端爲每highcharts - 服務器端的出口文件,並調用播放的renderBinary:

我通過調用另一個控制器這樣生成的模板圖表方法。

正如我所說的,模板在瀏覽器中與服務器端生成的圖表呈現良好。但是,當通過每小時執行一次的作業時,ChartGenerator.go()調用似乎不起作用。控制檯吐出這個:

INFO ~ /chartgenerator/go is not a URL; may be relative. 

有沒有人有任何想法如何解決這個問題?我已經證明,它的工作減去工作,現在需要弄清楚爲什麼當通過工作,它似乎並沒有工作。

編輯:按佩爾的建議,我的模板現在做這個調用ChartGenerator類(注意雙@ S):

<img src="@@{ChartGenerator.go()}"> 

我認爲已經得到我有點進一步與現在這得到在日誌中吐出:

Error during job execution (fun.EmailJob) 
Execution exception (In /fun/EmailJob.java around line 19) 
RuntimeException occured : java.util.concurrent.ExecutionException: java.util.concurrent.TimeoutException: No response received after 60000 
... 
09:23:54,687 WARN ~ bad URL given: http://<full url>/chartgenerator/go 
java.net.SocketTimeoutException: Read timed out 

如果我打HTTP的URL:在瀏覽器// <完整URL>/chartgenerator /去,則highcharts PNG文件獲取渲染正確地在瀏覽器中編輯。正如所料,即使在這個double @變更之後,如果我在瀏覽器中呈現模板(不包括pdf),模板也可以正確渲染服務器端生成的圖表。

編輯#2:由於這些問題我似乎通過從模板內調用控制器來呈現圖像(二進制),我想知道是否有可能通過File對象(包含圖像)作爲模板的render(...)方法的參數。因此,例如,讓我們說,渲染模板控制器做到這一點:

File image = ... // PNG chart as built by the highcharts-serverside-export library 
... 
File emailAttachment = new File("attachment.pdf"); 
PDF.writePDF(emailAttachment, "myTemplate.html", image); // This calls the PDF module to render the PDF from the given template and write it to the attachment.pdf File object 

我不知道我是否能以某種方式呈現在模板圖像直接,無需通過@@ {去... }的方式?

我試過在模板中放置$ {image},但在屏幕上只顯示attachment.pdf(有點期待)。

編輯#3:這裏是ChartGenerator類的樣子:

public final class ChartGenerator extends Controller { 
    public static void go() throws Exception { 
     ChartOptions options = SamplesFactory.getSingleton().createColumnBasic(); 
     HighchartsExporter pngExporter = ExportType.png.createExporter(); 
     File chart = new File("column-basic.png"); 
     pngExporter.export(options, null, chart); 
     response.setContentTypeIfNotSet("image/png"); 
     renderBinary(chart); 
    } 
} 

我目前只是產生一個示例圖表服務器端證明它可以pdf'ed。示例圖表生成按照highcharts-serverside-export文檔完成。

編輯#4:我也嘗試在控制器中添加一個動作方法來允許在瀏覽器中執行pdf,而服務器端生成的高圖也不會出現在pdf中,而前面提到的異常仍然存在發生。所以我可以排除它是Job to Controller工作流程中的一個問題。 (當然渲染模板而不pdf'ing仍然正常工作)

編輯#5:爲了幫助縮小問題的可能原因,我決定忽略highcharts(與highcharts - 服務器端的出口沿庫),並使用簡單的服務器端圖表庫jfreechart。再次,我可以不使用pdf來渲染模板,但只要我嘗試並使用包含圖表的模板(通過上述@@調用呈現),它就會因爲相同的原因而失敗(即給出錯誤的URL, java.net.SocketTimeoutException:讀取超時)。

回答

1

好了絕對路徑,我已經成功地得到它的工作(終於)。 這一切都源於我處於DEV模式的事實(顯然是因爲我仍在開發這一點功能)。但在DEV模式下,我(默認情況下)只能訪問一個線程。因此,所有我需要做的就是取消註釋application.conf執行池:

play.pool=3 

,然後我開始highchart呈現在服務器上,然後讓插入的PDF的一部分。附加線程用於呈現圖表的請求。一個線程對於這種情況是不夠的,因此調用URL來渲染圖像二進制文件。

0

看來你的問題是一個相對URL,代碼更改爲:

<img src="@@{ChartGenerator.go()}"> //notice double @@ 

產生

+0

感謝您的建議Pere。我已經更新了我的OP,詳細介紹了這個double @@企圖修復。 – digiarnie 2011-12-14 23:29:37

+0

我們可能需要使用go()方法中的代碼來查看可能存在的問題。現在很難猜到 – 2011-12-15 08:46:43

相關問題