1

我創建了一個簡單的成就係統,並且想要引入delayed_job(2.1.4)來處理處理。然而,在delayed_jobs表程序欄始終是零,這會導致last_error文本:Job failed to load: instance of IO needed. Handler nilDelayed_job(2.1.4)錯誤:作業加載失敗:需要IO實例。 Handler nil

這裏是我的設置:

成就觀察

class AchievementObserver < ActiveRecord::Observer 
    observe User, Comment, ... 

    def after_create(record) 
    # initiate delayed job to check conditions 
    Delayed::Job.enqueue(TrophyJob.new(record.id, record.class.name)) 
    end 
    ... 
end 

獎盃工作

class TrophyJob < Struct.new(:record_id, :record_type) 
    def perform 
    case record_type 
    when "User" 
     UserProfileCompleteTrophy.progress(User.find(record_id)) # complete your profile settings 
     NewsletterReceiverTrophy.progress(User.find(record_id)) # sign up for the newsletter 
    when "Comment" 
     CommentsAuthoredTrophy.progress(Comment.find(record_id)) # create x comments 
    ... 
    end 
    end 
end 

The entry in the delayed_jobs表被創建。但是,處理程序始終爲NULL。我已經嘗試了各種各樣的東西(之前通過了完整的對象,現在去了id + classname,如下所述:Weird exception with delayed_job;在觀察者中嘗試了xxxTrophy.delay.progress(...);等等) - 都沒有運氣。

我也有

require 'yaml' 
YAML::ENGINE.yamler= 'syck' 

在我boot.rb.

值得一提的一件事:雖然last_error文本被delayed_job填充,但attempt和failed_at列仍然爲NULL。

我錯過了什麼?

UPDATE

我覈實,系列化工作正如人們所預料:

ruby-1.9.2-p290 :004 > TrophyJob.new(1, "User").to_yaml 
=> "--- !ruby/struct:TrophyJob \nrecord_id: 1\nrecord_type: User\n" 
+0

您是否嘗試刪除yaml引擎自定義(或甚至可能)? – Nick

+0

這條線對於YAML來說是必需的(例如我的區域設置)。我只是提到它,表明我認爲這個問題可能是由YAML序列化問題引起的 - 但是發現這種可能性不大。不過謝謝。 – emrass

回答

4

找到解決方案:我的問題是由質量分配保護引起的。我有一個初始化程序來防止大規模分配:

# SECURITY: protect against mass assignment vulnerabilities 
# enforces explicitly setting attributes accessible in models (whitelisting) 
ActiveRecord::Base.send(:attr_accessible, nil) 

這阻止了delayed_job訪問處理程序字段!不知道這是否可以被視爲DJ中的錯誤。這是解決我的問題的初始化程序代碼:

# Imortant: delayed job requires some attributes to be accessible - make sure they are 
Delayed::Job.attr_accessible :priority, :payload_object, :handler, :run_at, :failed_at 
+0

直到我沒有爲我工作:Delayed :: Backend :: ActiveRecord :: Job.attr_accessible – nivcaner

+0

感謝您的更新 - 也許有DelayedJob的變化,造成這對你。如果其他人可以證實這一點,我會在評論中包含您的評論(加上您使用的DJ版本會有所幫助) – emrass

1

這有可能是你的處理程序欄是什麼東西被放進它太小了。你可以像這樣修復這個遷移:

change_column :delayed_jobs, :handler, :text, :limit => 64.kilobytes + 1 
+0

感謝您的提示。我試過沒有運氣。由於我只存儲ID和classname,我認爲TEXT字段應該足夠了(而不是LONGTEXT)。 – emrass

相關問題