Потоковый вывод из Prawn/Prawnto в Rails перед рендерингом
У кого-нибудь есть примеры запуска файлового потока перед процессом рендеринга / построения при использовании Prawn?
Ситуация такова, что у меня есть отчет из 350 или около того страниц, который занимает около 60 секунд для запуска на моей собственной рабочей станции, но при переводе его в рабочий режим (EC2) время запуска отчета увеличивается более чем на 300 секунд, и когда он завершает его не отправляет PDF в браузер.
Даже 60 секунд - это долгое время без обратной связи с пользователем, но 300 просто не работает, даже если вы ждете. Я хотел начать загрузку файла перед процессом рендеринга (для этого я использую представление.pdf.prawn с Prawnto), чтобы, по крайней мере, пользователь мог видеть, что что-то происходит во время его обработки, но так далеко не смогли этого сделать. Все примеры и руководства, которые я нашел, начинают загрузку после завершения рендеринга и после долгого ожидания.
Если ничего не помогает, я посмотрю на планирование отчета, но в идеале пользователь сможет просмотреть отчет, затем вернуться и внести изменения и запустить его снова, что, очевидно, не позволит планирование.
В Prawnto не так уж много кода, который можно показать, так как это всего лишь макет PDF в представлении, который вызывается через контроллер. Я попробовал send_file и переместил макет PDF в контроллер, чтобы запустить его без Prawnto, но все изменения, похоже, дают тот же результат - PDF отправляется в браузер после долгого ожидания.
У меня нет идей на данный момент, и буду признателен за любые идеи!
respond_to do |format|
format.pdf {
prawnto :prawn => {:page_layout => :portrait, :skip_page_creation => true}, :inline => false
render :layout => false
}
1 ответ
Если на создание PDF-файла у вас уходит более 60 секунд, вам следует рассмотреть возможность его загрузки в фоновый режим. Рекомендуется использовать Delayed::Job или Resque.
Пусть рабочий создаст PDF и сохранит его на диск; бросить флаг (например, в базе данных или что-то еще), чтобы указать, что PDF готов для загрузки.
Это добавит некоторую дополнительную сложность вашему приложению, но пользовательский интерфейс значительно улучшится, и у вас нет проблемы "не удается загрузить PDF", которую вы описываете. Кроме того, если ваше приложение интенсивно используется, вы можете с лёгкостью выгружать рабочих, создающих PDF, на другой сервер.