2012-03-13 12 views
2

私は遅延ジョブで初めて作業していますが、動作するのに幸運を祈ることはありません。理由はわかりません。ジョブはキューに入れられますが、実行されることはありません。それはデータベースから削除されますので、ワーカーはそれを処理しているようですが、それは実行可能なメソッドを実行することはありません。遅延ジョブが実行されていません

私は、次のinitalizer設定しました:

require 'delayed/worker' 
Dir.glob("./app/jobs/*.rb").each { |f| require f } 

Delayed::Worker.logger = ActiveSupport::BufferedLogger.new("log/dj.log", Rails.logger.level) 
module Delayed 
    class Worker 
    def self.dj_say(text) 
     self.logger.info "#{Time.now.strftime('%F %T %z')}: #{text}" 
    end 
    end 
end 

初期化子の作品を、そしてdj.logは仕事が/終了の起動時に書き込まれますありません。

私の仕事は次の要素で構成されます。このコードの

class UpdateServices 
    attr_accessor :options 
    def initialize(options) 
    self.options = options 
    end 

    def perform 
    #Debugging code 
    Delayed::Worker.dj_say "starting" 
    File.open("tmp/test.txt","w").close 
    #End debugging code 
    #bunch-o-code-here 
    Delayed::Worker.dj_say "completed" 
    end 
end 

どれもこれまでに実行されません。私はperformメソッドにデバッグコードを追加しようとしましたが、決して実行されないので、間違いなく何かが起こっています。モデルはこのように私のコントローラから呼び出され

class Service < ActiveRecord::Base 
    def start_updating!(options) 
    Delayed::Job.enqueue(UpdateServices.new(options), :priority => 0, :run_at => 30.seconds.from_now, :queue => 'update_services') 
    end 
end 

:私はこのようなモデルからのジョブを呼び出す

Service.new.start_updating!(params) 

私の唯一の推測では、私が遅れ呼ばれてるということです:: Job.enqueue誤っしかし、これは私が読んだことすべてに基づいて行われるべきであるように思われる。

答えて

2

DJが仕事を強制的に永続化するために何らかの理由でジョブをデシリアライズできない場合、これが起こる可能性があります。これはデフォルトでは記録されないように見えます。失敗したジョブの削除を無効にしてみてください:Delayed :: Worker.destroy_failed_jobs = falseおよびエラーがあるかどうかを確認してください。

+0

指定されたキューがなくてもそれ以上は機能しません。私はキューを制限しません。ワーカーは、テスト目的のために 'bundle exec rake jobs:work'で起動します。すべてのログショーは、ワーカーが開始すると1行、停止すると1行です。その間に何もない。 – Eugene

+1

ActiveRecordクエリ用のレールログを試してください。 DJポーリングが見えますか?また、ジョブはまだデータベースにありますか? – betamatt

+0

遅延ジョブが間違いなくポーリングされています。ここにログスニペット(https://gist.github.com/fb05ccb37abd42c08801)があります。ジョブは "実行"後にデータベースから削除されますが、コードは決して実行されません。そのようなDJは、仕事を見て、それを無視しています。 – Eugene

関連する問題