2013-04-16 35 views
1

我通過下面的代碼將csv文件傳遞給延遲作業。延遲作業錯誤。無法解析YAML

csv_text = IO.read(params[:emails_import].tempfile.to_path, :encoding => 'UTF-8').gsub(" ", "") 
csv_text = csv_text.gsub("\n\n", "\n") 
Delayed::Job.enqueue ImportContact.new(@list.id, csv_text), :queue => "import-list-#{@list.id}" 

我通過工頭收到以下錯誤消息。任何想法可能導致這個問題?我認爲這個錯誤可能在csv文件中,但我不知道是哪裏/是什麼導致了這個問題。

[Worker(host:ubuntu pid:22678)] Starting job worker 
16:50:22 worker.1 | SQL (129.4ms) UPDATE `delayed_jobs` SET locked_at = '2013-04-16 20:50:22', locked_by = 'host:ubuntu pid:22678' WHERE (id = 121 and (locked_at is null or locked_at < '2013-04-16 16:50:22') and (run_at <= '2013-04-16 20:50:22')) 
16:50:22 worker.1 | SQL (96.4ms) UPDATE `delayed_jobs` SET locked_by = null, locked_at = null WHERE (locked_by = 'host:ubuntu pid:22678') 
16:50:22 worker.1 | rake aborted! 
16:50:22 worker.1 | couldn't parse YAML at line 6709 column 4 
16:50:22 worker.1 | /home/cory/.rvm/gems/[email protected]/gems/delayed_job-3.0.3/lib/delayed/backend/base.rb:84:in `payload_object' 
16:50:22 worker.1 | /home/cory/.rvm/gems/[email protected]/gems/delayed_job-3.0.3/lib/delayed/backend/base.rb:71:in `name' 
16:50:22 worker.1 | /home/cory/.rvm/gems/[email protected]/gems/delayed_job-3.0.3/lib/delayed/worker.rb:230:in `handle_failed_job' 
16:50:22 worker.1 | /home/cory/.rvm/gems/[email protected]/gems/delayed_job-3.0.3/lib/delayed/worker.rb:191:in `block in run' 
16:50:22 worker.1 | /home/cory/.rvm/gems/[email protected]/gems/delayed_job-3.0.3/lib/delayed/lifecycle.rb:60:in `call' 
16:50:22 worker.1 | /home/cory/.rvm/gems/[email protected]/gems/delayed_job-3.0.3/lib/delayed/lifecycle.rb:60:in `block in initialize' 
16:50:22 worker.1 | /home/cory/.rvm/gems/[email protected]/gems/delayed_job-3.0.3/lib/delayed/lifecycle.rb:65:in `call' 
16:50:22 worker.1 | /home/cory/.rvm/gems/[email protected]/gems/delayed_job-3.0.3/lib/delayed/lifecycle.rb:65:in `execute' 
16:50:22 worker.1 | /home/cory/.rvm/gems/[email protected]/gems/delayed_job-3.0.3/lib/delayed/lifecycle.rb:38:in `run_callbacks' 
16:50:22 worker.1 | /home/cory/.rvm/gems/[email protected]/gems/delayed_job-3.0.3/lib/delayed/worker.rb:191:in `rescue in run' 
16:50:22 worker.1 | /home/cory/.rvm/gems/[email protected]/gems/delayed_job-3.0.3/lib/delayed/worker.rb:181:in `run' 
16:50:22 worker.1 | /home/cory/.rvm/gems/[email protected]/gems/delayed_job-3.0.3/lib/delayed/worker.rb:238:in `block in reserve_and_run_one_job' 
16:50:22 worker.1 | /home/cory/.rvm/gems/[email protected]/gems/delayed_job-3.0.3/lib/delayed/lifecycle.rb:60:in `call' 
16:50:22 worker.1 | /home/cory/.rvm/gems/ruby-[email protected]/gems/delayed_job-3.0.3/lib/delayed/lifecycle.rb:60:in `block in initialize' 
16:50:22 worker.1 | /home/cory/.rvm/gems/[email protected]/gems/delayed_job-3.0.3/lib/delayed/lifecycle.rb:65:in `call' 
16:50:22 worker.1 | /home/cory/.rvm/gems/[email protected]/gems/delayed_job-3.0.3/lib/delayed/lifecycle.rb:65:in `execute' 
16:50:22 worker.1 | /home/cory/.rvm/gems/[email protected]/gems/delayed_job-3.0.3/lib/delayed/lifecycle.rb:38:in `run_callbacks' 
16:50:22 worker.1 | /home/cory/.rvm/gems/[email protected]/gems/delayed_job-3.0.3/lib/delayed/worker.rb:238:in `reserve_and_run_one_job' 
16:50:22 worker.1 | /home/cory/.rvm/gems/[email protected]/gems/delayed_job-3.0.3/lib/delayed/worker.rb:166:in `block in work_off' 
16:50:22 worker.1 | /home/cory/.rvm/gems/[email protected]/gems/delayed_job-3.0.3/lib/delayed/worker.rb:165:in `times' 
16:50:22 worker.1 | /home/cory/.rvm/gems/[email protected]/gems/delayed_job-3.0.3/lib/delayed/worker.rb:165:in `work_off' 
16:50:22 worker.1 | /home/cory/.rvm/gems/[email protected]/gems/delayed_job-3.0.3/lib/delayed/worker.rb:133:in `block (4 levels) in start' 
16:50:22 worker.1 | /home/cory/.rvm/gems/[email protected]/gems/delayed_job-3.0.3/lib/delayed/worker.rb:132:in `block (3 levels) in start' 
16:50:22 worker.1 | /home/cory/.rvm/gems/[email protected]/gems/delayed_job-3.0.3/lib/delayed/lifecycle.rb:60:in `call' 
16:50:22 worker.1 | /home/cory/.rvm/gems/[email protected]/gems/delayed_job-3.0.3/lib/delayed/lifecycle.rb:60:in `block in initialize' 
16:50:22 worker.1 | /home/cory/.rvm/gems/[email protected]/gems/delayed_job-3.0.3/lib/delayed/lifecycle.rb:65:in `call' 
16:50:22 worker.1 | /home/cory/.rvm/gems/[email protected]/gems/delayed_job-3.0.3/lib/delayed/lifecycle.rb:65:in `execute' 
16:50:22 worker.1 | /home/cory/.rvm/gems/[email protected]/gems/delayed_job-3.0.3/lib/delayed/lifecycle.rb:38:in `run_callbacks' 
16:50:22 worker.1 | /home/cory/.rvm/gems/[email protected]/gems/delayed_job-3.0.3/lib/delayed/worker.rb:129:in `block (2 levels) in start' 
16:50:22 worker.1 | /home/cory/.rvm/gems/[email protected]/gems/delayed_job-3.0.3/lib/delayed/worker.rb:128:in `loop' 
16:50:22 worker.1 | /home/cory/.rvm/gems/[email protected]/gems/delayed_job-3.0.3/lib/delayed/worker.rb:128:in `block in start' 
16:50:22 worker.1 | /home/cory/.rvm/gems/[email protected]/gems/delayed_job-3.0.3/lib/delayed/plugins/clear_locks.rb:7:in `call' 
16:50:22 worker.1 | /home/cory/.rvm/gems/[email protected]/gems/delayed_job-3.0.3/lib/delayed/plugins/clear_locks.rb:7:in `block (2 levels) in <class:ClearLocks>' 
16:50:22 worker.1 | /home/cory/.rvm/gems/[email protected]/gems/delayed_job-3.0.3/lib/delayed/lifecycle.rb:78:in `call' 
16:50:22 worker.1 | /home/cory/.rvm/gems/[email protected]/gems/delayed_job-3.0.3/lib/delayed/lifecycle.rb:78:in `block (2 levels) in add' 
16:50:22 worker.1 | /home/cory/.rvm/gems/[email protected]/gems/delayed_job-3.0.3/lib/delayed/lifecycle.rb:60:in `call' 
16:50:22 worker.1 | /home/cory/.rvm/gems/[email protected]/gems/delayed_job-3.0.3/lib/delayed/lifecycle.rb:60:in `block in initialize' 
16:50:22 worker.1 | /home/cory/.rvm/gems/[email protected]/gems/delayed_job-3.0.3/lib/delayed/lifecycle.rb:78:in `call' 
16:50:22 worker.1 | /home/cory/.rvm/gems/[email protected]/gems/delayed_job-3.0.3/lib/delayed/lifecycle.rb:78:in `block in add' 
16:50:22 worker.1 | /home/cory/.rvm/gems/[email protected]/gems/delayed_job-3.0.3/lib/delayed/lifecycle.rb:65:in `call' 
16:50:22 worker.1 | /home/cory/.rvm/gems/[email protected]/gems/delayed_job-3.0.3/lib/delayed/lifecycle.rb:65:in `execute' 
16:50:22 worker.1 | /home/cory/.rvm/gems/[email protected]/gems/delayed_job-3.0.3/lib/delayed/lifecycle.rb:38:in `run_callbacks' 
16:50:22 worker.1 | /home/cory/.rvm/gems/[email protected]/gems/delayed_job-3.0.3/lib/delayed/worker.rb:127:in `start' 
16:50:22 worker.1 | /home/cory/.rvm/gems/[email protected]/gems/delayed_job-3.0.3/lib/delayed/tasks.rb:9:in `block (2 levels) in <top (required)>' 
16:50:22 worker.1 | /home/cory/.rvm/gems/[email protected]/bin/ruby_noexec_wrapper:14:in `eval' 
16:50:22 worker.1 | /home/cory/.rvm/gems/[email protected]/bin/ruby_noexec_wrapper:14:in `<main>' 
16:50:22 worker.1 | Tasks: TOP => jobs:work 
16:50:22 worker.1 | (See full trace by running task with --trace) 
16:50:22 worker.1 | exited with code 1 
16:50:22 system | sending SIGTERM to all processes 
SIGTERM received 
+0

爲什麼用如此大量的csv數據污染你的數據庫?如果它以您上傳的文件形式發佈給您,爲什麼不將它保留爲這種格式,並讓您排隊的工作在將其轉換到'ImportContact'實例之前進行轉換?運行獨立於delayed_job /隊列的作業時,是否有同樣的問題? – deefour

回答

0

我只是跑在一個全新的Rails應用程序的代碼遲發::工作裝(從你提供了什麼修改):

class List 
    attr_accessor :id 
end 
@list = List.new 
@list.id = 123 

class ImportContact 
    def initialize(list_id, csv_text) 
    @list_id = list_id 
    @csv_text = csv_text 
    end 

    def perform 
    puts @list_id 
    puts @csv_text.length 
    end 
end 

csv_text = IO.read('test_2000_import_contacts.csv', :encoding => 'UTF-8').gsub(" ", "") 
csv_text = csv_text.gsub("\n\n", "\n") 
Delayed::Job.enqueue ImportContact.new(@list.id, csv_text), :queue => "import-list-#{@list.id}" 

當我跑bundle exec rake jobs:work,一切都經歷了正確,這會導致我相信YAML對您正在導入的文件進行編碼或解碼的方式存在問題。

特別,我會跑

yaml = Delayed::Job.find(121).handler 
File.open('job-121.yml', 'w') { |f| f.write(yaml) } 

並通過文件檢查各地line 6709 column 4

但是,這可能是時候建議您將文件存儲在類似S3的文件中,並將URL傳遞給ImportContact工作人員,而不是整個CSV文本。這將緩解當前遇到的問題,並幫助您避免使用大量文本列來擴大數據庫。

+1

這對調試問題很有用。我最終將csv文件分割成小塊,這有助於減少反序列化問題。 – cdiamand