2009-12-09 5 views
1

У меня есть модель, которая представляет документ, название, автора и т. Д., Очищается от веб-таблицы, но содержимое нужно извлекать из PDF-файла, который требует времени и ресурсов. Это кажется логичным местом б delayed_jobs, но он всегда терпит неудачу, и поэтому я интересно, если есть ограничение я пропускаю или GCEПолучение отложенных заданий, работающих в рамках модели

#working code 
doc = Document.new 
doc.title = html_table.row[i].title 
doc.author = html_table.row[i].author 
doc.link = html_table.row[i].link 
doc.load_pdf_text # instance method which used the link extracted above to dowload a pdf and strip the text 
doc.save 

Приведенный выше код работает без каких-либо изменений. Я думал, что отсроченная работа позволила заменить прямой вызов метода с send_later вызовом и продолжение

#broken code 
#same as above except 
doc.send_later(:load_pdf_text) 

Этот код всегда будет терпеть неудачу работы, и он будет жаловаться на получении доступа к закрытым методам, которые являются частью модели, например, URL-адрес необходим для загрузки PDF-файла. Любые указатели будут очень благодарны.

Добавлено:

определение метода (ссылка и резюме представляет собой базу данных поддерживается атрибутом модели документа)

def load_pdf_text 
    tmpfilename = "#{RAILS_ROOT}/tmp/tmp_"+Time.now.to_s.gsub(/ |-/,"_") 
    Kernel.system("curl -s #{link} > #{tmpfilename}") # this is line 224 
    a="" 
    IO.popen("pdftotext -raw -l 1 #{tmpfilename} -"){ |pipe| a = pipe.read } 
    Kernel.system("rm #{tmpfilename}") 
    summary = a 
    save 
end 

Сообщение об ошибке

--- !ruby/struct:Delayed::PerformableMethod 
object: AR:Memo:4089 
method: :load_pdf_text 
args: [] 

| Attempt to call private method 
/Library/Ruby/Gems/1.8/gems/activerecord-2.3.2/lib/active_record/attribute_methods.rb:236:in `method_missing' 
/Users/naven87/test/memos/app/models/memo.rb:224:in `load_pdf_text' 
/Library/Ruby/Gems/1.8/gems/delayed_job-1.8.4/lib/delayed/performable_method.rb:23:in `send' 
/Library/Ruby/Gems/1.8/gems/delayed_job-1.8.4/lib/delayed/performable_method.rb:23:in `perform' 
/Library/Ruby/Gems/1.8/gems/delayed_job-1.8.4/lib/delayed/job.rb:215:in `invoke_job' 
/Library/Ruby/Gems/1.8/gems/delayed_job-1.8.4/lib/delayed/job.rb:93:in `run_with_lock' 
/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/timeout.rb:62:in `timeout' 
/Library/Ruby/Gems/1.8/gems/delayed_job-1.8.4/lib/delayed/job.rb:93:in `run_with_lock' 
/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/benchmark.rb:308:in `realtime' 
/Library/Ruby/Gems/1.8/gems/delayed_job-1.8.4/lib/delayed/job.rb:92:in `run_with_lock' 
/Library/Ruby/Gems/1.8/gems/delayed_job-1.8.4/lib/delayed/job.rb:153:in `reserve_and_run_one_job' 
/Library/Ruby/Gems/1.8/gems/delayed_job-1.8.4/lib/delayed/job.rb:152:in `each' 
/Library/Ruby/Gems/1.8/gems/delayed_job-1.8.4/lib/delayed/job.rb:152:in `reserve_and_run_one_job' 
/Library/Ruby/Gems/1.8/gems/delayed_job-1.8.4/lib/delayed/job.rb:199:in `work_off' 
/Library/Ruby/Gems/1.8/gems/delayed_job-1.8.4/lib/delayed/job.rb:198:in `times' 
/Library/Ruby/Gems/1.8/gems/delayed_job-1.8.4/lib/delayed/job.rb:198:in `work_off' 
/Library/Ruby/Gems/1.8/gems/delayed_job-1.8.4/lib/delayed/worker.rb:28:in `start' 
/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/benchmark.rb:308:in `realtime' 
/Library/Ruby/Gems/1.8/gems/delayed_job-1.8.4/lib/delayed/worker.rb:27:in `start' 
/Library/Ruby/Gems/1.8/gems/delayed_job-1.8.4/lib/delayed/worker.rb:24:in `loop' 
/Library/Ruby/Gems/1.8/gems/delayed_job-1.8.4/lib/delayed/worker.rb:24:in `start' 
/Users/naven87/.gem/ruby/1.8/gems/collectiveidea-delayed_job-1.8.2/lib/delayed/tasks.rb:13 
/Library/Ruby/Gems/1.8/gems/rake-0.8.7/lib/rake.rb:636:in `call' 
/Library/Ruby/Gems/1.8/gems/rake-0.8.7/lib/rake.rb:636:in `execute' 
/Library/Ruby/Gems/1.8/gems/rake-0.8.7/lib/rake.rb:631:in `each' 
/Library/Ruby/Gems/1.8/gems/rake-0.8.7/lib/rake.rb:631:in `execute' 
/Library/Ruby/Gems/1.8/gems/rake-0.8.7/lib/rake.rb:597:in `invoke_with_call_chain' 
/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/monitor.rb:242:in `synchronize' 
/Library/Ruby/Gems/1.8/gems/rake-0.8.7/lib/rake.rb:590:in `invoke_with_call_chain' 
/Library/Ruby/Gems/1.8/gems/rake-0.8.7/lib/rake.rb:583:in `invoke' 
/Library/Ruby/Gems/1.8/gems/rake-0.8.7/lib/rake.rb:2051:in `invoke_task' 
/Library/Ruby/Gems/1.8/gems/rake-0.8.7/lib/rake.rb:2029:in `top_level' 
/Library/Ruby/Gems/1.8/gems/rake-0.8.7/lib/rake.rb:2029:in `each' 
/Library/Ruby/Gems/1.8/gems/rake-0.8.7/lib/rake.rb:2029:in `top_level' 
/Library/Ruby/Gems/1.8/gems/rake-0.8.7/lib/rake.rb:2068:in `standard_exception_handling' 
/Library/Ruby/Gems/1.8/gems/rake-0.8.7/lib/rake.rb:2023:in `top_level' 
/Library/Ruby/Gems/1.8/gems/rake-0.8.7/lib/rake.rb:2001:in `run' 
/Library/Ruby/Gems/1.8/gems/rake-0.8.7/lib/rake.rb:2068:in `standard_exception_handling' 
/Library/Ruby/Gems/1.8/gems/rake-0.8.7/lib/rake.rb:1998:in `run' 
/Library/Ruby/Gems/1.8/gems/rake-0.8.7/bin/rake:31 
/usr/bin/rake:19:in `load' 
/usr/bin/rake:19 
+0

все еще не удается, с .send: send_later ... – naven87

+0

Is load_pdf_text частный метод Memo? Это говорит вам, что ошибка происходит в строке 224 memo.rb, какая строка соответствует вашему выдержке выше? –

+0

Это метод экземпляра объекта Memo ActiveRecord – naven87

ответ

3

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

+0

У меня очень симулирующая проблема. У меня есть метод преобразования в модели, которая вызывается задержкой заданий. В конце этого метода я хотел бы установить атрибут модели в true, но это не будет. У вас есть подсказка для меня, как я могу получить доступ ко всем атрибутам моей модели в рамках метода с задержкой вызова? – Mathias

+0

Я не смотрел на это некоторое время, поэтому мой тестовый пример не под рукой. Две вещи, которые я бы предложил, заключались бы в том, чтобы действие замедленных заданий фактически извлекало объект, а не используя сериализованный объект. Затем извлеките из сериализованного объекта любые данные, необходимые для репликации изменений и т. Д. Сообщите мне, как это происходит. – naven87

0

Пожалуйста вывесить сообщения об ошибках здесь и, если это возможно источник модели. В то же время вы можете обойти эту проблему, посылая метод и аргументы doc как явного сообщения:

doc.send :send_later, :extract_pdf_text 

Это не решение, хотя. Вы должны реорганизовать свой код, чтобы не получить эти ошибки.

+0

Я получаю ту же ошибку, любые другие идеи? – naven87