Re: Prawn-generated PDF sent via e-mail asynchronously with delayed_job

95 views
Skip to first unread message

Alexey Skoblikov

unread,
Apr 22, 2013, 8:56:03 AM4/22/13
to delay...@googlegroups.com
Solved.

Prawn was too big in the serialized form and it was initiated in the job object on initialize.

Moved creation of prawn document to a job method itself, and it started working.


воскресенье, 21 апреля 2013 г., 13:16:00 UTC+4 пользователь Alexey Skoblikov написал:
I have the web-form, that passes the data to the model, that generates pdf with prawn and sends it with ActionMailer.

If I do it without `delayed_job`, synchronously, then everything is great.
If I do it with `delayed_job`, asynchronously, then I get an error.

    (1.6ms)  UPDATE `delayed_jobs` SET `last_error` = 'uninitialized stream\n/Users/almays/.rvm/gems/ruby-1.9.3-p286/gems/ttfunk-1.0.3/lib/ttfunk/reader.rb:22:in `pos\'\n/Users/almays/.rvm/gems/ruby-1.9.3-p286/gems/ttfunk-1.0.3/lib/ttfunk/reader.rb:22:in `parse_from\'\n/Users/almays/.rvm/gems/ruby-1.9.3-p286/gems/ttfunk-1.0.3/lib/ttfunk/table.rb:20:in `initialize\'\n/Users/almays/.rvm/gems/ruby-1.9.3-p286/gems/ttfunk-1.0.3/lib/ttfunk.rb:50:in `new\'\n/Users/almays/.rvm/gems/ruby-1.9.3-p286/gems/ttfunk-1.0.3/lib/ttfunk.rb:50:in `cmap\'\n/Users/almays/.rvm/gems/ruby-1.9.3-p286/bundler/gems/prawn-bd8af853a6f2/lib/prawn/font/ttf.rb:180:in `cmap\'\n/Users/almays/.rvm/gems/ruby-1.9.3-p286/bundler/gems/prawn-bd8af853a6f2/lib/prawn/font/ttf.rb:219:in `character_width_by_code\'\n/Users/almays/.rvm/gems/ruby-1.9.3-p286/bundler/gems/prawn-bd8af853a6f2/lib/prawn/font/ttf.rb:51:in `block in compute_width_of\'\n/Users/almays/.rvm/gems/ruby-1.9.3-p286/bundler/gems/prawn-bd8af853a6f2/lib/prawn/font/ttf.rb:50:in `codepoints\'\n/Users/almays/.rvm/gems/ruby-1.9.3-p286/bundler/gems/prawn-bd8af853a6f2/lib/prawn/font/ttf.rb:50:in `each\'\n/Users/almays/.rvm/gems/ruby-1.9.3-p286/bundler/gems/prawn-bd8af853a6f2/lib/prawn/font/ttf.rb:50:in `inject\'\n/Users/almays/.rvm/gems/ruby-1.9.3-p286/bundler/gems/prawn-bd8af853a6f2/lib/prawn/font/ttf.rb:50:in `compute_width_of\'\n/Users/almays/.rvm/gems/ruby-1.9.3-p286/bundler/gems/prawn-bd8af853a6f2/lib/prawn/font.rb:236:in `width_of\'\n/Users/almays/.rvm/gems/ruby-1.9.3-p286/bundler/gems/prawn-bd8af853a6f2/lib/prawn/core/text/formatted/line_wrap.rb:96:in `block in add_fragment_to_line\'\n/Users/almays/.rvm/gems/ruby-1.9.3-p286/bundler/gems/prawn-bd8af853a6f2/lib/prawn/core/text/formatted/line_wrap.rb:92:in `each\'\n/Users/almays/.rvm/gems/ruby-1.9.3-p286/bundler/gems/prawn-bd8af853a6f2/lib/prawn/core/text/formatted/line_wrap.rb:92:in `add_fragment_to_line\'\n/Users/almays/.rvm/gems/ruby-1.9.3-p286/bundler/gems/prawn-bd8af853a6f2/lib/prawn/core/text/formatted/line_wrap.rb:77:in `block in apply_font_settings_and_add_fragment_to_line\'\n/Users/almays/.rvm/gems/ruby-1.9.3-p286/bundler/gems/prawn-bd8af853a6f2/lib/prawn/core/text/formatted/arranger.rb:239:in `apply_font_size\'\n/Users/almays/.rvm/gems/ruby-1.9.3-p286/bundler/gems/prawn-bd8af853a6f2/lib/prawn/core/text/formatted/arranger.rb:164:in `block in apply_font_settings\'\n/Users/almays/.rvm/gems/ruby-1.9.3-p286/bundler/gems/prawn-bd8af853a6f2/lib/prawn/core/text.rb:212:in `character_spacing\'\n/Users/almays/.rvm/gems/ruby-1.9.3-p286/bundler/gems/prawn-bd8af853a6f2/lib/prawn/core/text/formatted/arranger.rb:157:in `apply_font_settings\'\n/Users/almays/.rvm/gems/ruby-1.9.3-p286/bundler/gems/prawn-bd8af853a6f2/lib/prawn/core/text/formatted/line_wrap.rb:73:in `apply_font_settings_and_add_fragment_to_line\'\n/Users/almays/.rvm/gems/ruby-1.9.3-p286/bundler/gems/prawn-bd8af853a6f2/lib/prawn/core/text/formatted/line_wrap.rb:45:in `wrap_line\'\n/Users/almays/.rvm/gems/ruby-1.9.3-p286/bundler/gems/prawn-bd8af853a6f2/lib/prawn/core/text/formatted/wrap.rb:45:in `wrap\'\n/Users/almays/.rvm/gems/ruby-1.9.3-p286/bundler/gems/prawn-bd8af853a6f2/lib/prawn/text/formatted/box.rb:263:in `block (4 levels) in render\'\n/Users/almays/.rvm/gems/ruby-1.9.3-p286/bundler/gems/prawn-bd8af853a6f2/lib/prawn/font.rb:96:in `font_size\'\n/Users/almays/.rvm/gems/ruby-1.9.3-p286/bundler/gems/prawn-bd8af853a6f2/lib/prawn/text/formatted/box.rb:256:in `block (3 levels) in render\'\n/Users/almays/.rvm/gems/ruby-1.9.3-p286/bundler/gems/prawn-bd8af853a6f2/lib/prawn/core/text.rb:194:in `text_rendering_mode\'\n/Users/almays/.rvm/gems/ruby-1.9.3-p286/bundler/gems/prawn-bd8af853a6f2/lib/prawn/text/formatted/box.rb:247:in `block (2 levels) in render\'\n/Users/almays/.rvm/gems/ruby-1.9.3-p286/bundler/gems/prawn-bd8af853a6f2/lib/prawn/core/text.rb:212:in `character_spacing\'\n/Users/almays/.rvm/gems/ruby-1.9.3-p286/bundler/gems/prawn-bd8af853a6f2/lib/prawn/text/formatted/box.rb:246:in `block in render\'\n/Users/almays/.rvm/gems/ruby-1.9.3-p286/bundler/gems/prawn-bd8af853a6f2/lib/prawn/font.rb:116:in `save_font\'\n/Users/almays/.rvm/gems/ruby-1.9.3-p286/bundler/gems/prawn-bd8af853a6f2/lib/prawn/text/formatted/box.rb:245:in `render\'\n/Users/almays/.rvm/gems/ruby-1.9.3-p286/bundler/gems/prawn-bd8af853a6f2/lib/prawn/text/box.rb:118:in `text_box\'\n/Users/almays/Sites/qimen/app/pdfs/calendar_pdf.rb:22:in `block in make_body\'\n/Users/almays/.rvm/gems/ruby-1.9.3-p286/bundler/gems/prawn-bd8af853a6f2/lib/prawn/core/page.rb:60:in `stamp_stream\'\n/Users/almays/.rvm/gems/ruby-1.9.3-p286/bundler/gems/prawn-bd8af853a6f2/lib/prawn/stamp.rb:81:in `create_stamp\'\n/Users/almays/.rvm/gems/ruby-1.9.3-p286/bundler/gems/prawn-bd8af853a6f2/lib/prawn/repeater.rb:97:in `initialize\'\n/Users/almays/.rvm/gems/ruby-1.9.3-p286/bundler/gems/prawn-bd8af853a6f2/lib/prawn/repeater.rb:77:in `new\'\n/Users/almays/.rvm/gems/ruby-1.9.3-p286/bundler/gems/prawn-bd8af853a6f2/lib/prawn/repeater.rb:77:in `repeat\'\n/Users/almays/Sites/qimen/app/pdfs/calendar_pdf.rb:18:in `make_body\'\n/Users/almays/Sites/qimen/app/pdfs/pdfer.rb:12:in `render\'\n/Users/almays/Sites/qimen/app/mailers/pdf_mailer.rb:15:in `calendar\'\n/Users/almays/.rvm/gems/ruby-1.9.3-p286/gems/actionpack-3.2.9/lib/abstract_controller/base.rb:167:in `process_action\'\n/Users/almays/.rvm/gems/ruby-1.9.3-p286/gems/actionpack-3.2.9/lib/abstract_controller/base.rb:121:in `process\'\n/Users/almays/.rvm/gems/ruby-1.9.3-p286/gems/actionpack-3.2.9/lib/abstract_controller/rendering.rb:45:in `process\'\n/Users/almays/.rvm/gems/ruby-1.9.3-p286/gems/actionmailer-3.2.9/lib/action_mailer/base.rb:458:in `process\'\n/Users/almays/.rvm/gems/ruby-1.9.3-p286/gems/actionmailer-3.2.9/lib/action_mailer/base.rb:452:in `initialize\'\n/Users/almays/.rvm/gems/ruby-1.9.3-p286/gems/actionmailer-3.2.9/lib/action_mailer/base.rb:439:in `new\'\n/Users/almays/.rvm/gems/ruby-1.9.3-p286/gems/actionmailer-3.2.9/lib/action_mailer/base.rb:439:in `method_missing\'\n/Users/almays/Sites/qimen/app/models/calendar.rb:51:in `deliver\'\n/Users/almays/.rvm/gems/ruby-1.9.3-p286/gems/delayed_job-3.0.5/lib/delayed/performable_method.rb:26:in `perform\'\n/Users/almays/.rvm/gems/ruby-1.9.3-p286/gems/delayed_job-3.0.5/lib/delayed/backend/base.rb:95:in `block in invoke_job\'\n/Users/almays/.rvm/gems/ruby-1.9.3-p286/gems/delayed_job-3.0.5/lib/delayed/lifecycle.rb:60:in `call\'\n/Users/almays/.rvm/gems/ruby-1.9.3-p286/gems/delayed_job-3.0.5/lib/delayed/lifecycle.rb:60:in `block in initialize\'\n/Users/almays/.rvm/gems/ruby-1.9.3-p286/gems/delayed_job-3.0.5/lib/delayed/lifecycle.rb:65:in `call\'\n/Users/almays/.rvm/gems/ruby-1.9.3-p286/gems/delayed_job-3.0.5/lib/delayed/lifecycle.rb:65:in `execute\'\n/Users/almays/.rvm/gems/ruby-1.9.3-p286/gems/delayed_job-3.0.5/lib/delayed/lifecycle.rb:38:in `run_callbacks\'\n/Users/almays/.rvm/gems/ruby-1.9.3-p286/gems/delayed_job-3.0.5/lib/delayed/backend/base.rb:92:in `invoke_job\'\n/Users/almays/.rvm/gems/ruby-1.9.3-p286/gems/delayed_job-3.0.5/lib/delayed/worker.rb:203:in `block (2 levels) in run\'\n/Users/almays/.rvm/rubies/ruby-1.9.3-p286/lib/ruby/1.9.1/timeout.rb:68:in `timeout\'\n/Users/almays/.rvm/gems/ruby-1.9.3-p286/gems/delayed_job-3.0.5/lib/delayed/worker.rb:203:in `block in run\'\n/Users/almays/.rvm/rubies/ruby-1.9.3-p286/lib/ruby/1.9.1/benchmark.rb:295:in `realtime\'\n/Users/almays/.rvm/gems/ruby-1.9.3-p286/gems/delayed_job-3.0.5/lib/delayed/worker.rb:202:in `run\'\n/Users/almays/.rvm/gems/ruby-1.9.3-p286/gems/delayed_job-3.0.5/lib/delayed/worker.rb:259:in `block in reserve_and_run_one_job\'\n/Users/almays/.rvm/gems/ruby-1.9.3-p286/gems/delayed_job-3.0.5/lib/delayed/lifecycle.rb:60:in `call\'\n/Users/almays/.rvm/gems/ruby-1.9.3-p286/gems/delayed_job-3.0.5/lib/delayed/lifecycle.rb:60:in `block in initialize\'\n/Users/almays/.rvm/gems/ruby-1.9.3-p286/gems/delayed_job-3.0.5/lib/delayed/lifecycle.rb:65:in `call\'\n/Users/almays/.rvm/gems/ruby-1.9.3-p286/gems/delayed_job-3.0.5/lib/delayed/lifecycle.rb:65:in `execute\'\n/Users/almays/.rvm/gems/ruby-1.9.3-p286/gems/delayed_job-3.0.5/lib/delayed/lifecycle.rb:38:in `run_callbacks\'\n/Users/almays/.rvm/gems/ruby-1.9.3-p286/gems/delayed_job-3.0.5/lib/delayed/worker.rb:259:in `reserve_and_run_one_job\'\n/Users/almays/.rvm/gems/ruby-1.9.3-p286/gems/delayed_job-3.0.5/lib/delayed/worker.rb:187:in `block in work_off\'\n/Users/almays/.rvm/gems/ruby-1.9.3-p286/gems/delayed_job-3.0.5/lib/delayed/worker.rb:186:in `times\'\n/Users/almays/.rvm/gems/ruby-1.9.3-p286/gems/delayed_job-3.0.5/lib/delayed/worker.rb:186:in `work_off\'\n/Users/almays/.rvm/gems/ruby-1.9.3-p286/gems/delayed_job-3.0.5/lib/delayed/worker.rb:151:in `block (4 levels) in start\'\n/Users/almays/.rvm/rubies/ruby-1.9.3-p286/lib/ruby/1.9.1/benchmark.rb:295:in `realtime\'\n/Users/almays/.rvm/gems/ruby-1.9.3-p286/gems/delayed_job-3.0.5/lib/delayed/worker.rb:150:in `block (3 levels) in start\'\n/Users/almays/.rvm/gems/ruby-1.9.3-p286/gems/delayed_job-3.0.5/lib/delayed/lifecycle.rb:60:in `call\'\n/Users/almays/.rvm/gems/ruby-1.9.3-p286/gems/delayed_job-3.0.5/lib/delayed/lifecycle.rb:60:in `block in initialize\'\n/Users/almays/.rvm/gems/ruby-1.9.3-p286/gems/delayed_job-3.0.5/lib/delayed/lifecycle.rb:65:in `call\'\n/Users/almays/.rvm/gems/ruby-1.9.3-p286/gems/delayed_job-3.0.5/lib/delayed/lifecycle.rb:65:in `execute\'\n/Users/almays/.rvm/gems/ruby-1.9.3-p286/gems/delayed_job-3.0.5/lib/delayed/lifecycle.rb:38:in `run_callbacks\'\n/Users/almays/.rvm/gems/ruby-1.9.3-p286/gems/delayed_job-3.0.5/lib/delayed/worker.rb:149:in `block (2 levels) in start\'\n/Users/almays/.rvm/gems/ruby-1.9.3-p286/gems/delayed_job-3.0.5/lib/delayed/worker.rb:148:in `loop\'\n/Users/almays/.rvm/gems/ruby-1.9.3-p286/gems/delayed_job-3.0.5/lib/delayed/worker.rb:148:in `block in start\'\n/Users/almays/.rvm/gems/ruby-1.9.3-p286/gems/delayed_job-3.0.5/lib/delayed/plugins/clear_locks.rb:7:in `call\'\n/Users/almays/.rvm/gems/ruby-1.9.3-p286/gems/delayed_job-3.0.5/lib/delayed/plugins/clear_locks.rb:7:in `block (2 levels) in <class:ClearLocks>\'\n/Users/almays/.rvm/gems/ruby-1.9.3-p286/gems/delayed_job-3.0.5/lib/delayed/lifecycle.rb:78:in `call\'\n/Users/almays/.rvm/gems/ruby-1.9.3-p286/gems/delayed_job-3.0.5/lib/delayed/lifecycle.rb:78:in `block (2 levels) in add\'\n/Users/almays/.rvm/gems/ruby-1.9.3-p286/gems/delayed_job-3.0.5/lib/delayed/lifecycle.rb:60:in `call\'\n/Users/almays/.rvm/gems/ruby-1.9.3-p286/gems/delayed_job-3.0.5/lib/delayed/lifecycle.rb:60:in `block in initialize\'\n/Users/almays/.rvm/gems/ruby-1.9.3-p286/gems/delayed_job-3.0.5/lib/delayed/lifecycle.rb:78:in `call\'\n/Users/almays/.rvm/gems/ruby-1.9.3-p286/gems/delayed_job-3.0.5/lib/delayed/lifecycle.rb:78:in `block in add\'\n/Users/almays/.rvm/gems/ruby-1.9.3-p286/gems/delayed_job-3.0.5/lib/delayed/lifecycle.rb:65:in `call\'\n/Users/almays/.rvm/gems/ruby-1.9.3-p286/gems/delayed_job-3.0.5/lib/delayed/lifecycle.rb:65:in `execute\'\n/Users/almays/.rvm/gems/ruby-1.9.3-p286/gems/delayed_job-3.0.5/lib/delayed/lifecycle.rb:38:in `run_callbacks\'\n/Users/almays/.rvm/gems/ruby-1.9.3-p286/gems/delayed_job-3.0.5/lib/delayed/worker.rb:147:in `start\'\n/Users/almays/.rvm/gems/ruby-1.9.3-p286/gems/delayed_job-3.0.5/lib/delayed/tasks.rb:9:in `block (2 levels) in <top (required)>\'\n/Users/almays/.rvm/gems/ruby-1.9.3-p286/gems/rake-10.0.4/lib/rake/task.rb:246:in `call\'\n/Users/almays/.rvm/gems/ruby-1.9.3-p286/gems/rake-10.0.4/lib/rake/task.rb:246:in `block in execute\'\n/Users/almays/.rvm/gems/ruby-1.9.3-p286/gems/rake-10.0.4/lib/rake/task.rb:241:in `each\'\n/Users/almays/.rvm/gems/ruby-1.9.3-p286/gems/rake-10.0.4/lib/rake/task.rb:241:in `execute\'\n/Users/almays/.rvm/gems/ruby-1.9.3-p286/gems/rake-10.0.4/lib/rake/task.rb:184:in `block in invoke_with_call_chain\'\n/Users/almays/.rvm/rubies/ruby-1.9.3-p286/lib/ruby/1.9.1/monitor.rb:211:in `mon_synchronize\'\n/Users/almays/.rvm/gems/ruby-1.9.3-p286/gems/rake-10.0.4/lib/rake/task.rb:177:in `invoke_with_call_chain\'\n/Users/almays/.rvm/gems/ruby-1.9.3-p286/gems/rake-10.0.4/lib/rake/task.rb:170:in `invoke\'\n/Users/almays/.rvm/gems/ruby-1.9.3-p286/gems/rake-10.0.4/lib/rake/application.rb:143:in `invoke_task\'\n/Users/almays/.rvm/gems/ruby-1.9.3-p286/gems/rake-10.0.4/lib/rake/application.rb:101:in `block (2 levels) in top_level\'\n/Users/almays/.rvm/gems/ruby-1.9.3-p286/gems/rake-10.0.4/lib/rake/application.rb:101:in `each\'\n/Users/almays/.rvm/gems/ruby-1.9.3-p286/gems/rake-10.0.4/lib/rake/application.rb:101:in `block in top_level\'\n/Users/almays/.rvm/gems/ruby-1.9.3-p286/gems/rake-10.0.4/lib/rake/application.rb:110:in `run_with_threads\'\n/Users/almays/.rvm/gems/ruby-1.9.3-p286/gems/rake-10.0.4/lib/rake/application.rb:95:in `top_level\'\n/Users/almays/.rvm/gems/ruby-1.9.3-p286/gems/rake-10.0.4/lib/rake/application.rb:73:in `block in run\'\n/Users/almays/.rvm/gems/ruby-1.9.3-p286/gems/rake-10.0.4/lib/rake/application.rb:160:in `standard_exception_handling\'\n/Users/almays/.rvm/gems/ruby-1.9.3-p286/gems/rake-10.0.4/lib/rake/application.rb:70:in `run\'\n/Users/almays/.rvm/gems/ruby-1.9.3-p286/gems/rake-10.0.4/bin/rake:33:in `<top (required)>\'\n/Users/almays/.rvm/gems/ruby-1.9.3-p286/bin/rake:19:in `load\'\n/Users/almays/.rvm/gems/ruby-1.9.3-p286/bin/rake:19:in `<main>\'\n/Users/almays/.rvm/gems/ruby-1.9.3-p286/bin/ruby_noexec_wrapper:14:in `eval\'\n/Users/almays/.rvm/gems/ruby-1.9.3-p286/bin/ruby_noexec_wrapper:14:in `<main>\'', `attempts` = 1, `run_at` = '2013-04-20 20:06:54', `locked_at` = NULL, `locked_by` = NULL, `updated_at` = '2013-04-20 20:06:48' WHERE `delayed_jobs`.`id` = 55

Application part is

    /Users/almays/Sites/qimen/app/pdfs/calendar_pdf.rb:22:in `block in make_body\'
    /Users/almays/Sites/qimen/app/pdfs/calendar_pdf.rb:18:in `make_body\'
    /Users/almays/Sites/qimen/app/mailers/pdf_mailer.rb:15:in `calendar\'
    /Users/almays/Sites/qimen/app/models/calendar.rb:51:in `deliver\'

`calendar.rb::deliver` is the task I try to run with `delayed_job`. It is migrated from the former controller. I just prepare some data, create `Prawn::Document` ancestor instance and launch the mailer on line 51.

    PdfMailer.calendar(@pdf, @user, @charts).deliver

Then `pdf_mailer.rb` is just an ActionMailer thing. The only point is that I render the pdf from here at line 15.

    attachments[pdf.filename] = pdf.render charts

It works without `delayed_job`. With — doesn't. (I have rewritten the render to accept data to be included in the calendar).

Then the Prawn part.
`calendar_pdf.rb:18` is just a colontitle repeatable clause

    pdf.repeat(:all) do

The error happens when I do some real PDF write for the first time. I tried commenting out the parts of the `pdf.`-commands. Doesn't help. First `pdf.text` in the code gives an error. In this case it is line 22

    pdf.text_box l_colon, at: @colontitles, inline_format: true

If it were just `pdf.text` it would do the same error.

The most weird thing is that I already have similar module in my application. And it works with `delayed_job`. This one doesn't.

Reply all
Reply to author
Forward
0 new messages