如何使用Jobs异步渲染Play Framework PDF模块的PDF?

时间:2012-02-24 10:26:27

标签: playframework

我在Play Framework中发送电子邮件,我想渲染一个PDF文件以用作电子邮件附件。我选择使用Play Framework PDF模块,因为它使用Play的常规Groovy HTML模板系统。

我可以使用以下代码在我的Controller方法中将PDF文件渲染为ByteArrayOutputStream:

PDF.MultiPDFDocuments docs = new PDF.MultiPDFDocuments("myfile.pdf);
ByteArrayOutputStream os = new ByteArrayOutputStream();
MyEntity myArgument;
PDF.writePDF(os, docs, myArgument);

但是,我不喜欢PDF渲染阻止我的请求处理线程的想法。我想在Job中异步呈现PDF。问题是,当我在Job中移动代码时,我开始获得NullPointerExceptions。这是因为Play PDF模块的PDF呈现方法广泛使用了Controller方法中可用的Session,Request,Params和Flash对象,但在Job中不可用。例如,方法play.modules.pdf.PDF.renderTemplateAsPDF有以下几行:

templateBinding.put("session", Scope.Session.current());
templateBinding.put("request", Http.Request.current());
templateBinding.put("flash", Scope.Flash.current());
templateBinding.put("params", Scope.Params.current());

有没有办法添加会话,请求,参数和Flash信息以安全地用于我的PDF作业?或者我可以以某种方式阻止PDF模块的渲染方法调用它们?我真的不需要模板中的Request和Params信息。

1 个答案:

答案 0 :(得分:0)

PDF需要在控制器中呈现,否则会给你带来比预期更多的麻烦。

您可以使用异步编程(请参阅here)。在示例中,他们使用生成 pdf 作为用例:)