2009-12-09 73 views
1

我有一個模型代表一個文檔,標題,作者等從Web表中被刮取,但內容需要從時間和資源密集型的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 2009-12-10 07:27:51

+0

是load_pdf_text備註的私有方法嗎? 它告訴你,錯誤發生在memo.rb的第224行上,哪一行對應於上面的摘錄內容? – 2010-04-06 02:09:19

+0

這是一個Memo ActiveRecord對象的實例方法 – naven87 2010-04-07 09:06:22

回答

3

根據進一步的調查,看起來延遲作業序列化對象和反序列化實際發送消息時,它不再在相同的範圍內,並且它不能訪問該對象的任何私有實例方法。這很令人困惑,因爲它沒有通過延遲工作來運行它,它會找到工作,但是一旦傳遞給延遲的工作,它不再作爲對象本身運行方法,而是將方法發送給對象,創建一組不同的權限。你需要公開實例方法或者提供一個公共機制,這個公共機制可以延遲作業可以用來進行任何私有的操作。

+0

我有一個非常類似的問題。我在一個被延遲工作調用的模型中有一個轉換方法。在這個方法的最後,我想將模型的屬性設置爲true,但不會。你有沒有給我提示如何在延遲調用方法中訪問我的模型中的所有屬性? – Mathias 2011-04-17 20:01:04

+0

我沒有看過這段片刻,所以我的測試用例不方便。我建議的兩件事是讓延遲作業操作實際上檢索對象而不是使用序列化對象。然後從序列化對象中提取複製更改所需的任何數據等。讓我知道這是怎麼回事。 – naven87 2011-04-26 05:56:47

0

在這裏,如果可能發佈錯誤信息模型來源。在此期間,您可以通過發送方法和參數doc作爲一個明確的信息解決這個問題:

doc.send :send_later, :extract_pdf_text 

這不是解決辦法,但。您應該重構您的代碼,以免發生這些錯誤。

+0

我得到了同樣的錯誤,任何其他想法? – naven87 2009-12-13 22:40:10