2011-12-14 40 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

相关问题