레일 앱. 우리는 모델을 저장합니다 (비디오). 우리는 그 객체에 콜백을 가지고 :내 resque 작업에서 개체를 찾을 수없는 이유는 무엇입니까?
def send_to_background_job
Resque.enqueue(AddVideo, self.id)
end
작업자가 호출 될 때 :
는after_create :send_to_background_job, :if => :persisted?
방법은 같습니다. 그것은 다음과 같은 작업을 수행 :이 비디오를 찾기 위해 콘솔을 레일로 이동하는 경우, 때문에, 조금 이상한
AddVideo
Arguments
51061
Exception
NoMethodError
Error
undefined method `original_filename' for nil:NilClass
:
class AddVideo
@queue = :high
def self.perform(video_id)
video = Video.find(video_id)
video.original_file_name
....
Resque - 웹은 오류를보고합니다. 그것은 존재합니다. 또한 Resque.enqueue(AddVideo, 51061)
을 (를) SECOND로 호출하면 오류없이 실행됩니다.
작업자/작업을 만드는 데 걸리는 시간보다 데이터베이스에 레코드를 저장하는 데 더 많은 시간이 걸리는 것처럼 보입니다. 그러나 개체가 저장 된 후에 만 개체가 Resque 작업을 호출하기 때문에이 문은 더할 수 없습니다. Rails에서는 모델의 콜백 메소드 (after_create
)를 통해이 작업을 수행합니다.
이것이이 문제에서 중요한 역할을하는지 알 수 없습니다. 이니셜 라이저 파일에서 내가 가진 : 객체가 저장되는 실제 트랜잭션이 아직 커밋과 백그라운드 작업이 이미 작업을 시작하지 않기 때문에
Resque.before_fork do
defined?(ActiveRecord::Base) and
ActiveRecord::Base.connection.disconnect!
end
Resque.after_fork do
defined?(ActiveRecord::Base) and
ActiveRecord::Base.establish_connection
end