这是我制作的previous post的扩展名。
总结一下发生了什么:
作业没有做太多工作,但直接呼叫控制器以生成PDF并发送电子邮件。我打电话给控制器来完成工作,因为我正在使用PDF模块(当前)需要HTTP请求作为其PDF处理的一部分。以下是我通过Job调用控制器的方法:
WS.url( “我的/ URL /该/点/到/与/控制器”)得到();
我之前发布的包含高图JS图表的PDF的问题在于它生成了图表客户端,这对于PDF生成来说已经太晚了,因此我的PDF生成减去了图表。为了解决这个问题,我现在使用highcharts-serverside-export生成图表服务器端
如果我使用上面的相同类并在浏览器中呈现模板(即直接通过控制器并忽略作业),则会在服务器端创建图表,并在浏览器中正确呈现视图。
我通过调用另一个控制器来生成模板中的图表:
<img src="@{ChartGenerator.go()}">
ChartGenerator控制器基本上按照highcharts-serverside-export文档构建图表服务器端,并调用Play的renderBinary方法。
正如我所说,模板在浏览器中使用服务器端生成的图表呈现正常。但是,当通过每小时执行一次的Job时,ChartGenerator.go()调用似乎不起作用。控制台吐了出来:
INFO ~ /chartgenerator/go is not a URL; may be relative.
有没有人有任何想法如何解决这个问题?我已经证明它可以减去工作,现在需要弄清楚为什么在通过工作时,它似乎不起作用。
编辑:根据Pere的建议,我的模板现在通过这样做来调用ChartGenerator类(注意双@):
<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://&lt;的网址在浏览器中,full urrts&gt; / chartgenerator / go 正确地在浏览器中呈现了highcharts png文件。正如预期的那样,即使在这个double @ change之后,如果我在浏览器中渲染模板(没有pdf'ing),模板也会正确地呈现服务器端生成的图表。
编辑#2:我遇到这些问题似乎是通过从模板中调用控制器来渲染图像(二进制),我想知道是否可以传递文件object(包含图像)作为模板的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'ing,而服务器端生成的高图也不会出现在pdf和之前提到的异常仍然发生。所以我可以排除它是Job to Controller工作流程的问题。 (当然渲染没有pdf的模板仍然可以正常工作)
编辑#5:为了帮助缩小问题的可能原因,我决定忽略highcharts(以及highcharts-serverside-export库)并只使用简单的服务器端图表库jfreechart的。同样,我可以在没有pdf的情况下渲染模板,但是一旦我尝试pdf包含图表的模板(通过前面提到的@@调用呈现),它最终会因同样的原因失败(即给出错误的URL, java.net.SocketTimeoutException:读取超时)。
答案 0 :(得分:1)
好的,我已经设法让它工作(最后)。 这一切都源于我处于DEV模式的事实(显然是因为我仍在开发这一点功能)。但在DEV模式下,我(默认情况下)只能访问一个线程。所以我所要做的就是取消注释application.conf中的执行池:
play.pool=3
然后我的高图开始在服务器上呈现,然后作为PDF的一部分插入。附加线程用于呈现图表的请求。一个线程对于这种情况是不够的,因此调用URL来呈现图像二进制文件。
答案 1 :(得分:0)
您的问题似乎是相对网址,请将代码更改为:
<img src="@@{ChartGenerator.go()}"> //notice double @@
生成绝对路径