這是我製作的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:讀取超時)。
感謝您的建議Pere。我已經更新了我的OP,詳細介紹了這個double @@企圖修復。 – digiarnie 2011-12-14 23:29:37
我們可能需要使用go()方法中的代碼來查看可能存在的問題。現在很難猜到 – 2011-12-15 08:46:43