2013-04-09 5 views
1

Rails 3.2.12에서 delayed_job 3.0.5 (delayed_job_active_record 0.4.1)를 실행 중입니다. "탈 직렬화"로 인해 실패한 일부 작업에 문제가 있습니다. 여기에 실패 핸들러 중 하나의 정말 간단한 예는 다음과 같습니다Delayed :: DeserializationError를 알아낼 수 없습니다.

--- !ruby/struct:Delayed::PerformableMethod 
object: LOAD;Project;924951 
method: :send_project_open_close_without_delay 
args: [] 

내가이 일을 호출 할 :

Delayed::DeserializationError: Job failed to load: undefined method `members' for nil:NilClass. 

모든 사람이 더 이상 존재하는 AR 객체에 의해 발생 생각하는 것을 . 내 경우, 나는 잘 핸들러를 실행할 수 있습니다

Project.find(924951).send_open_close_without_delay 

는 오류의 원인이 다른 무엇을 할 수 있을까?

답변

0

에 다음 그냥 누군가가이 문제로 실행되는 경우에 추가하십시오. 나는 일자리의 일부에 Delayed Job의 이전 버전이 주입되었다는 이유로 그 원인을 알아 냈습니다. 따라서 새로운 지연 작업 (Delayed Job)이 처리를 시도 할 때 처리기를 비 직렬화 할 수 없었습니다.

+0

어떻게 해결 했습니까? – JellicleCat

+0

이전 버전에서 시작된 지연된 작업 프로세스를 중지하고 이전 작업을 삭제했습니다. –

0

레일 3.2로 업그레이드 할 때도이 문제가 발생했다고 생각합니다. 내가 얻은 오류는 지연된 작업에 사용되는 yaml 처리기로 인해 발생했습니다. config/boot.rb

require 'rubygems' 
require 'yaml' 
YAML::ENGINE.yamler = 'syck' 
+0

팁 주셔서 감사합니다. 나는 그것을 시도했지만 여전히 같은 오류가 발생합니까? –

+0

지연 작업을 추가 한 후 다시 시작하면 아이디어가 없습니다. 'members'를 호출하는 코드의 일부분을 확인하십시오 :) – jvnill

+0

그래, 나는 "회원"을 언급하는 것이 아무것도 없다. delayed_job을 사용하여 티켓을 개설하고 버그를 수정하기를 바랍니다. –

0

PerformableMethod에 사용 된 개체 형식을 변경하고 serialization 처리기를 변경 한 Delayed::Job으로 업그레이드하여이 문제가 발생했습니다. 변화는 주변에서 발생

Delayed::Job.where('failed_at is not null').each do |dj| 
    dj.handler = dj.handler.gsub('struct:Delayed', 'object:Delayed') 
    Delayed::Worker.new.run(dj) 
end 

: https://github.com/collectiveidea/delayed_job/commit/7b8a79a72c0ee5d8bac4bc0b183d1cce9cedff85

PerformableMethod 만들기 모든 이전 작업을 수정하고 지연 :: 작업에 대한 새 기본값을 고수하려는 경우, 당신은이 쿼리와 함께 사람을 실패 해결할 수 있습니다 클래스 대신 Struct이 필요합니다.

관련 문제