Delayed_job(2.1.4)错误:作业无法加载:需要IO实例。 处理者无
我创建了一个简单的成就系统,并想引入delayed_job(2.1.4)来处理。 但是,delayed_jobs表中的处理程序列始终为nil,这会导致last_error文本: Job failed to load: instance of IO needed. Handler nil
Job failed to load: instance of IO needed. 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
将创建delayed_jobs表中的条目。 但是,处理程序始终为NULL。 我已经尝试了各种各样的东西(之前通过完整的对象,现在转到id + classname,如下所述:extreme_job 奇怪的exception ;在观察者中尝试了xxxTrophy.delay.progress(…);等等 – 所有没有运气。
我也有
require 'yaml' YAML::ENGINE.yamler= 'syck'
在我的boot.rb.
值得一提的是:虽然last_error文本由delayed_job填充,但尝试和failed_at列仍为NULL。
我错过了什么?
UPDATE
我validation序列化的工作正如人们所期望的那样:
ruby-1.9.2-p290 :004 > TrophyJob.new(1, "User").to_yaml => "--- !ruby/struct:TrophyJob \nrecord_id: 1\nrecord_type: User\n"
找到解决方案:我的问题是由质量分配保护引起的。 我有一个初始化程序来防止批量分配:
# 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
您的处理程序列可能太小而无法放入其中。 您可以在迁移中修复此问题,如下所示:
change_column :delayed_jobs, :handler, :text, :limit => 64.kilobytes + 1