Play Framework: шаблон PDF, в котором используется библиотека JS Highcharts с помощью Job - PullRequest
6 голосов
/ 14 декабря 2011

Это расширение предыдущего поста , которое я сделал.

Чтобы подвести итог происходящему:

  • Я использую задание, которое выполняетсяежечасно генерируется PDF для отправки в виде вложения в электронное письмо
  • Задание не требует особых усилий, но вызывает непосредственно контроллер, чтобы сгенерировать PDF и отправить электронное письмо.Я вызываю контроллер для выполнения этой работы, поскольку я использую модуль PDF, который (в настоящее время) требует HTTP-запроса как часть его обработки PDF.Вот как я вызываю контроллер через задание:

    WS.url («мой / url / тот / указывает / на / на / контроллер»). Get ();

  • Моя предыдущая проблема с PDF-шаблоном, который включает в себя JS-диаграмму с высокими диаграммами, состоит в том, что она генерирует клиентскую диаграмму, что было слишком поздно для генерации PDF-файла, и, следовательно, мой PDF-файл был получен без диаграммы.Чтобы обойти это, я теперь использую highcharts-serveride-export для генерации серверной диаграммы

Если я использую те же классы выше и отображаю шаблонв браузере (т. е. проходите через контроллер напрямую и игнорируете задание) диаграмма создается на стороне сервера, а представление корректно отображается в браузере.

Я генерирую диаграмму в шаблоне, вызывая другой контроллернапример:

<img src="@{ChartGenerator.go()}">

Контроллер ChartGenerator просто строит серверную часть диаграммы в соответствии с документацией экспорта-экспорта highcharts-server и вызывает метод renderBinary Play.

Как я уже сказал, шаблонхорошо отображает в браузере с серверной диаграммы.Однако при выполнении задания, которое выполняется ежечасно, вызов ChartGenerator.go (), похоже, не работает.Консоль выдает это:

INFO  ~ /chartgenerator/go is not a URL; may be relative.

У кого-нибудь есть идеи, как это можно исправить?Я доказал, что это работает минус Иов, и теперь мне нужно выяснить, почему при прохождении Иова он не работает.

Редактировать: Согласно предложению Пере, мойшаблон теперь вызывает класс 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

Если я нажму URL-адрес http://< полный URL-адрес> / chartgenerator / go в браузере, png-файл highcharts будет правильно отображаться в браузере.И, как и ожидалось, даже после этого двойного @ изменения, если я отобразлю шаблон в браузере (без pdf'ing), шаблон будет корректно отображаться на серверной диаграмме.

Редактировать # 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

Мне интересно, смогу ли я каким-то образом визуализировать это изображение в шаблоне без необходимости проходить через @@{...} way?

Я пытался поместить $ {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-serveride-export.

Edit # 4: Я также попытался добавить метод действия в контроллер, чтобы разрешить pdf'ing в то время как вбраузер, и серверная сгенерированная старшая диаграмма также не появляется в PDF, и ранее упомянутое исключение все еще происходит.Таким образом, я могу исключить, что это проблема с рабочим процессом Job to Controller.(конечно, рендеринг шаблона без pdf'а все еще работает отлично)

Edit # 5: Чтобы помочь сузить возможные причины проблемы, я решил игнорировать старшие графики (вместе с библиотекой highcharts-serveride-export) и просто использовать простую серверную библиотеку диаграмм jfreechart , Опять же, я могу визуализировать шаблон без pdf'ing, но как только я пытаюсь и pdf шаблон, который включает диаграмму (визуализированную с помощью вышеупомянутого @@ call), он завершается сбоем по той же причине (то есть, плохой URL, java.net.SocketTimeoutException: тайм-аут чтения).

Ответы [ 2 ]

1 голос
/ 19 декабря 2011

Хорошо, мне удалось заставить его работать (наконец-то).Все это связано с тем, что я нахожусь в режиме DEV (очевидно, потому что я все еще разрабатываю эту часть функциональности).Но в режиме DEV у меня (по умолчанию) есть доступ только к одному потоку.Поэтому все, что мне нужно было сделать, это раскомментировать пул выполнения в application.conf:

play.pool=3

, а затем моя старшая диаграмма начала рендериться на сервере, а затем вставляться как часть PDF.Дополнительный поток использовался для запроса на рендеринг графика.Одного потока было недостаточно для этого сценария, и поэтому обращение к URL-адресу для визуализации изображения в двоичном виде зависло.

0 голосов
/ 14 декабря 2011

Похоже, что ваша проблема - относительный URL, измените код на:

<img src="@@{ChartGenerator.go()}"> //notice double @@

для генерации абсолютных путей

...