2012-03-07 6 views
3

Я чувствую, что это глупый вопрос, потому что каждый, кажется, замалчивает этот аспект вещей.Как получить вывод из delayed_job, например, в формате PDF/HTML

Моя потребность проста - я запускаю некоторые отчеты, используя 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, но не похоже, что это относится и к моему вопросу.

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

ответ

0

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

EDIT

это выглядит, как вы получите обратно идентификатор задания при вводе его в очереди: polling with delayed_job

+0

Ну, да, я мог бы - это то, что я имел в виду под термином «Я полагаю, мог бы дать им таблицу и модель ActiveRecord, если бы это помогло» - я мог бы создать, скажем, запись ReportGen, вернуть идентификатор этого новую запись, сохранить состояние и имя файла там, и тогда пользователь может опросить это. , но (а) это звучит как нечто большее, чем я должен был делать, и (б) почему я не могу найти какой-либо образец кода для кого-то другого, делающего что-то подобное? Я бы ожидал, что у записи THAT будет какой-то идентификационный номер для задания, поэтому я могу позже уйти/убрать висячие задания? Откуда мне это получить, и почему я не могу просто передать это? –

1

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

+0

Есть ли пример кода, который показывает, как это сделать? –

+1

Hi @ stephan.com, здесь это пример приложения показывает, как установить и получить прогресс: https://github.com/iron-io/heroku_sinatra_example См. Tweet_worker.rb, как он устанавливает его, и hello.rb, как это делается получает его. В hello.erb есть ajax, который показывает, как отображать его в пользовательском интерфейсе. –

Смежные вопросы