私たちのRailsアプリケーションで。モデル(ビデオ)を保存します。私たちは、そのオブジェクトのコールバックを持っている:私のresqueジョブがオブジェクトを見つけることができないのはなぜですか?
after_create :send_to_background_job, :if => :persisted?
方法は次のようになります。労働者が呼び出されると
def send_to_background_job
Resque.enqueue(AddVideo, self.id)
end
。これは、次のことを行います。私はこのビデオを探すために、コンソールをレールに行けば、ので、少し奇妙である
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