これはprevious postの拡張です。何が起こっているかを要約するPlay Framework:ハイチャートを使用するテンプレートのPDF化ジョブによるJSライブラリ
:
- 私は仕事をしない電子メールに添付ファイルとして送信するためにPDFを生成します毎時間実行されます仕事
を使用しています多くのことを行うが、PDFを生成して電子メールを送信するコントローラに直接呼び出す。 PDF処理の一部として(現在)HTTPリクエストが必要なPDFモジュールを使用しているので、私はコントローラに作業を依頼します。ジョブを介してコントローラーを呼び出す方法は次のとおりです。
WS.url( "my/url/that/points/to/the/controller")。get();
ハイチャートJSチャートが含まれているテンプレートを使用したPDFの以前の問題は、PDF生成に時間がかかり、PDFを生成してからチャートを引いたグラフクライアント側を生成したことです。これを回避するために、私は今(すなわち、直接コントローラを介して移動して、ジョブを無視する)私は上記と同じクラスを使用し、ブラウザでテンプレートをレンダリングする場合は、チャートサーバー側
を生成するhighcharts-serverside-exportを使用していますグラフはサーバー側に作成され、ビューはブラウザーで正しくレンダリングされます。
私はこのような別のコントローラを呼び出すことによって、テンプレートでチャートを生成しています:
<img src="@{ChartGenerator.go()}">
ChartGeneratorコントローラだけで、基本的highcharts-サーバーサイド輸出ドキュメントごとにチャートのサーバーサイドを構築し、プレイのrenderBinaryを呼び出します方法。
私が言ったように、テンプレートは、サーバー側で生成されたグラフでブラウザに正しく表示されます。しかし、毎時実行するJobを経由する場合、ChartGenerator.go()コールは機能していないようです。コンソールはこれを吐き出します:
INFO ~ /chartgenerator/go is not a URL; may be relative.
これはどのように修正できますか?私はそれが仕事を除いて働くことを証明しました、そして今、仕事を経て行くときに働かない理由を理解する必要があります。
編集:ペールの提案を1として、私のテンプレートが今(ダブル@さんに注意してください)これを行うことにより、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のURLをヒットした場合:// <完全なURL>/chartgeneratorは/ブラウザでを行く、highcharts PNGファイルをレンダリング取得しますブラウザで正しく編集されました。そして、このダブル@変更の後でも、(pdfなしで)ブラウザでテンプレートをレンダリングすると、テンプレートはサーバー側で生成されたグラフで正しくレンダリングされます。
編集#2:これらの問題では、テンプレート内からイメージ(バイナリ)をレンダリングするコントローラを呼び出しているようですが、Fileオブジェクトを渡すことが可能かどうかは疑問ですimage)を、テンプレートの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
直接@@ {を経由することなく、... }道は?
Iは、(ちょっと期待)画面上のテンプレートに$ {画像}を入れ、それだけレンダリングattachment.pdf試みました。
編集#3:
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できることを証明するために、サンプルチャートサーバー側を生成しています:ここでは、ChartGeneratorクラスは次のようになります。サンプルチャートの生成はhighcharts-serverside-exportのドキュメントに従って行われます。
編集#4:また、アクションメソッドをコントローラに追加して、ブラウザでpdfを許可しましたが、サーバー側で生成されたハイチャートもpdfおよび前述の例外に表示されません発生する。だから私はそれがJob to Controllerのワークフローの問題であることを除外することができます。 (もちろんpdf'ingを使わないでテンプレートをレンダリングする)
編集#5:問題の原因を絞り込むために、ハイチャートを無視することを決めました(highcharts-serverside-exportライブラリ)単純なサーバー側チャートライブラリjfreechartを使用するだけです。ここでも、私はpdfを使わずにテンプレートをレンダリングすることができますが、グラフを含むテンプレート(前述の@@呼び出しでレンダリングされたもの)をpdfしようとすると、同じ理由で失敗します。 java.net.SocketTimeoutException:読み取りタイムアウト)。それはあなたの問題は、相対URLである、にコードを変更するようだ
+1素晴らしい発見!:) –
私は同じ問題を抱えています。しかし、それはプロダクト環境で動作し、プロードモードで動作します。私はそれがnbプロセッサ+ 1を取ると思ったので、私はprodモードのためにこの行をコメントしました。それは動作していない、と私はコメントを残し、まだ働いていない。理由は何でしょうか? –