2012-02-24 24 views
3

私はPlay Frameworkで電子メールメッセージを送信していますが、PDFファイルをレンダリングして電子メールの添付ファイルとして使用したいとします。 Play Frameworkの標準のGroovy HTMLテンプレートシステムを使用しているため、Play Framework PDFモジュールを使用することにしました。ジョブを使用して非同期にPlay Framework PDFモジュールでPDFをレンダリングする方法はありますか?

私は次のコードで私のコントローラメソッドにByteArrayOutputStreamにPDFファイルをレンダリングすることができます

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

は、しかし、私はPDFレンダリングが私の要求処理スレッドをブロックしているという考えを好きではありません。私は仕事でPDFを非同期的にレンダリングしたいと思います。問題は、コードをJob内に移動すると、NullPointerExceptionsを取得し始めるということです。これは、Play PDFモジュールのPDFレンダリングメソッドが、Controllerメソッドで使用可能でしたが、Jobで使用できないSessionオブジェクト、Requestオブジェクト、Paramsオブジェクト、Flashオブジェクトを広範囲に使用しているためです。たとえば、メソッド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()); 

は私のPDFの仕事のために安全に利用できるようにするセッション、リクエスト、PARAMSとFlashの情報を追加する方法はありますか?あるいは、どうやってPDFモジュールのレンダリングメソッドがそれらを呼び出すのを防ぐことができますか?テンプレートにRequestとParamsの情報が本当に必要なわけではありません。

+0

興味深い質問。私は今週末に調査します。 –

+0

アイデア@Zenklys? – skrii

答えて

0

PDFをコントローラにレンダリングする必要があります。そうしないと、必要以上に頭痛がかかります。

非同期プログラミング(hereを参照)を使用できます。この例では、pdfを使用例として生成します。

+1

私もあなたが特定したリンクに投稿しようとしていましたが、これは実際に仕事でpdfを生成し、Promiseを返すので、コントローラで実際には行われません。私は、この文書の例は、PDFモジュールを使用した実行可能なソリューションではなく、使用例であると考えています。 – Codemwnci

+0

@Codemwnciはい、あなたは正しいです、私は単語の "仕事"の部分に注意を払っていない:( –

関連する問題