这是我制作的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