как получить вывод из delayed_job, например, отчет PDF / HTML - PullRequest
3 голосов
/ 07 марта 2012

Мне кажется, что это глупый вопрос, потому что все, кажется, затмевают этот аспект вещей.

Моя потребность проста - я запускаю некоторые отчеты, используя Ruport на Heroku.Сложные отчеты занимают много времени, и они истекают.Я решил использовать delayed_job - но я мог бы использовать что-то еще вместо этого.Как только я узнаю, что я делаю, я могу использовать это и для других целей.

Я вижу множество примеров, Railscasts, документацию о том, как запустить delayed_job и его братьев, как управлять вашимОчередь заданий и т. д. У меня могут возникнуть некоторые вопросы, как только я доберусь до этой точки, но сейчас ...

Как, черт возьми, я могу вернуться к своей работе в очереди?

Прямо сейчас,Я просто генерирую вывод, как это:

@report_output     = @report_controller.render(@report_format,@report_params)
send_data @report_output, :filename => "#{@report_type}.#{@report_format}", :type => "application/#{@report_format}" unless :html == @report_format

(а затем, если это HTML-отчет, он просто отображает страницу нормально)

он отлично работает в разработке, время ожидания в производстве,Из документации видно, что было бы довольно просто сгенерировать вывод и отправить его пользователю по почте, тогда мне не нужно беспокоиться о возврате работы.

Но я не хочутот.Я просто хочу показать пользователю страницу прогресса, регулярно опрашивать сервер, пока это не будет сделано, а затем перенаправить его, чтобы увидеть вывод HTML или PDF.Я ожидаю, что это вернет какой-то идентификатор задания и вернет его пользователю, чтобы он мог проверить его, но я не вижу, откуда это происходит.Полагаю, я мог бы просто посмотреть в таблицу, но это кажется глупым.Я мог бы даже показать пользователю список поставленных в очередь / выполненных заданий и позволить им выбрать одно вручную, но это излишне.Они просто хотят загрузить отчет и не возражают, если это займет минуту или две.

На самом деле я не использую таблицу для своих отчетов, нет необходимости, они не сохраняются -но я полагаю, мог бы дать им таблицу и модель ActiveRecord, если это помогло.Не похоже, что мне нужно это делать.Я использую Rails 2.3, но, похоже, это не относится и к моему вопросу.

Кажется, то, что я спрашиваю, настолько очевидно, что никто не удосужился записать его, но яне могу найти это.Есть ли пример приложения?Что мне не хватает?Я чувствую себя глупо.

Ответы [ 2 ]

1 голос
/ 08 марта 2012

Вы можете использовать размещенный сервис фоновой обработки, такой как IronWorker (заявление об отказе: я работаю для Iron.io).Вы передадите задание в IronWorker и попросите работника обновить статус, пока он обрабатывает задание в фоновом режиме.Затем вы можете опросить IronWorker, чтобы показать статус пользователю, и когда он закончит, обновите страницу.Вы также можете использовать обратные вызовы от работника для синхронизации между работником и приложением.Рад помочь с этим.

0 голосов
/ 07 марта 2012

где вы храните результат генерации ruport?если вы положите его где-нибудь на диск, например, в хранилище S3, вы можете предварительно сгенерировать имя вашего отчета и передать его клиенту.чем вы можете опросить хранилище S3, если файл присутствует, и затем передать его клиенту после завершения создания.

EDIT

похоже, что вы возвращаете идентификатор задания при установкеэто в очереди: опрос с delayed_job

...