1

나는 단순한 업적 시스템을 만들었고 처리를 위해 delayed_job (2.1.4)을 도입하려고했습니다. 그러나, delayed_jobs 테이블의 핸들러 열이 만약 Last_Error 텍스트에 어떤 결과 항상 nil 일 :Delayed_job (2.1.4) 오류 : 작업을로드하지 못했습니다. IO의 인스턴스가 필요합니다. 처리기 없음

성취 옵저버

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 

트로피 작업

: 여기 Job failed to load: instance of IO needed. Handler nil

내 설정이다

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으로 이동했습니다 : Weird exception with delayed_job; xxxTrophy.delay.progress (...)를 관찰자에서 시도한 것 등) - 모두 운이 좋지 않습니다.

나는 또한 내 boot.rb.에

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

언급 할 가치가있는 한 가지 : last_error 텍스트가 delayed_job으로 채워지더라도 시도 및 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

지연 될 때까지 작동하지 않았습니다. 지연됨 :: 백엔드 :: ActiveRecord :: Job.attr_accessible – nivcaner

+0

업데이트 해 주셔서 감사합니다. 아마도이 문제의 원인이 DelayedJob에 변경되었습니다. 다른 사람이 이것을 확인할 수 있으면 당신의 코멘트를 답안에 포함시킬 것입니다 (그리고 당신이 사용하고있는 DJ 버전도 도움이 될 것입니다) – emrass

1

그것은 당신의 핸들러 열이 투입되고 있는지 너무 작은 가능성이 있습니다. 다음과 같이 마이그레이션에서이 문제를 해결할 수 있습니다.

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

힌트를 보내 주셔서 감사합니다. 나는 운이없는 그것을 시도했다. 나는 ID와 클래스 이름 만 저장하고 있기 때문에 LONGTEXT가 아닌 TEXT 필드로 충분하다고 생각합니다. – emrass