2010-12-29 3 views
16

を空ではないが、ここに私のGemfileです:Delayed_jobは、メソッドを実行する実行するが、私は新鮮なレール3のアプリを持っているジョブキュー

source 'http://rubygems.org' 
gem 'rails', '3.0.0' gem 'delayed_job' 
gem 'sqlite3-ruby', :require => 'sqlite3' 

は、ここで私はキューしたいジョブを表すクラスです:

class Me < Struct.new(:something) 
    def perform 
    puts "Hello from me" 
    logger.info "Hello from me" 
    logger.debug "Hello from me" 
    raise Exception.new 
    end 
end 

実行していない労働者とのコンソールから:

irb(main):002:0> Delayed::Job.enqueue Me.new(1) 
=> #<Delayed::Backend::ActiveRecord::Job id: 7, priority: 0, attempts: 0, handler: "--- !ruby/struct:Me \nsomething: 1\n", last_error: nil, run_at: "2010-12-29 07:24:11", locked_at: nil, failed_at: nil, locked_by: nil, created_at: "2010-12-29 07:24:11", updated_at: "2010-12-29 07:24:11"> 

私が述べたように:何の労働者が存在しませんランニング:しかし、何もputsの結果として起こりません

irb(main):006:0> Delayed::Job.all 
=> [] 

、何もlogger呼び出しからログインしていない、:

irb(main):003:0> Delayed::Job.all 
=> [#<Delayed::Backend::ActiveRecord::Job id: 7, priority: 0, attempts: 0, handler: "--- !ruby/struct:Me \nsomething: 1\n", last_error: nil, run_at: "2010-12-29 07:24:11", locked_at: nil, failed_at: nil, locked_by: nil, created_at: "2010-12-29 07:24:11", updated_at: "2010-12-29 07:24:11">] 

を私はキューが空に取得しscript/delayed_job run

で労働者を開始します例外は発生しません。私は何か助けや洞察力や何かを試していただければ幸いです。

+0

私はまったく同じ問題を抱えています。あなたはこれを解決したことがありますか? – Leddo

答えて

0

私はちょうどIRBにあなたのクラスをコピーしてMe.new.performを実行しようとしました:

Hello from me 
NameError: undefined local variable or method `logger' for #<struct Me something=nil> 
from (irb):6:in `perform' 
from (irb):14 

あなたのクラスは、「ロガー」へのアクセスを持っていますか?

ファイルを開いたり書き込んだりすることができますか?心の中で

File.open("testing.txt", 'w') {|f| f.write("hello") } 

ベア遅れジョブ労働者の「プット」コマンドが出力その stdoutにあなたはおそらくこれを見ることはありませんでしょうだから。また、ロギングを行う場合は、performメソッド内に新しいLoggerインスタンスを作成して、そのようにする必要があると思います。

+0

説明したように、ロガー呼び出しを削除してファイルを書き込もうとしました。私はまだ同じ動作を見ています - ジョブはキューから削除されますが、ファイルは書き込まれません。 – James

0

チェックログは、あなたは、少なくともジョブが起動され、DelayedJobメッセージについて何かを見るべきであると、打ち上げは、端末にその終了ステータス

ものです:

tail -f log/development.log 

は、レールコンソールから再試行します単純なActiveRecordクエリを実行した後にDelayedJobを使って何が起きているかを調べる。あなたはデフォルトでは他の端末

歓声、 A.

12

に記録されていることを読むことができ、delayed_jobが失敗したジョブを破棄:

だから、最初のステップは、初期化子を設定し、その行動

を無効にすることです
Delayed::Worker.destroy_failed_jobs = false 

また、デシリアライズに失敗した場合は、即時ジョブが失敗します。

ジョブの削除がトリガーされます(削除していない場合)。

だから、それはかなり役に立たないですが、少なくともあなたはそれがその後、直列化復元エラーです知っているよworker.rb

rescue DeserializationError => error 
    say "DeserializationError: #{error.message}" 
    job.last_error = "{#{error.message}\n#{error.backtrace.join('\n')}" 
    failed(job) 

のライン120の周りに、以下を追加してみてください。

私はちょうど仕事wを使ってしまった。 perform()メソッドの構造体。はるかに信頼性の高い。また、ジョブ定義を別のファイルとして保存して、クラスローダーがクラス定義をモデルのどこかにインライン展開するのではなく、実行中に見つけることができるようにしてください。

6

ベンWは、これは、労働者がどのように振る舞うべきかを定義し

"#{Rails.root}/config/initializers/delayed_job_worker.rb" 

下のファイルを持っていることを確認し、絶対的に正しいです。作業者は静かにエラーを取り除くだけです。

これを実行すると、エラーの詳細を確認できるはずです。私の例では、delayed_job_mongoidを使用していたので、これは "last_error"のエントリを追加しました(これは遅延テーブルのmysqlテーブルには関係ありません..)

ベンWが締結したように、作成しているオブジェクトはアプリケーション(またはその点では作業者)に知られています。私の問題は、Railsコンソールでクラスオブジェクトをテストしていたことです。労働者はこのクラスを知りませんでした。

私application.rbファイルで

module TextSender 
    class Application < Rails::Application 
    require "#{Rails.root.to_s}/lib/SendTextJob.rb" 

と私のlibファイル:

class SendTextJob < Struct.new(:text, :number) 
    def perform 
    Rails.logger.info "Sending #{text} to #{number}" 
    puts "Successfully sent text" 
    end 
end 

が続い

Delayed::Job.enqueue SendTextJob.new("Work on this text NOW, please?", "5551231234") 

を実行するには、私のログ/ development.logファイルで確認されましたこれは成功しました。私はまた、作成メソッドとオブジェクト(ユーザーオブジェクトまたはあなたが持つかもしれないモデル)をこのメソッドでテストし、うまくいきました。

2

私はこの問題を抱えていました。これは、lib/ディレクトリのRails 3ファイルがオートロードされていないためです。診断するには、私が追加:

# application.rb 
Delayed::Worker.destroy_failed_jobs = false 

をベン・W.これで述べたように、私はlast_errorを検査できて、何が起こっていた私に言いました。

だからオートローディング問題を解決するために、私はSOにカップルの答えを見つけましたが、要旨は、この追加された:

親切 http://hemju.com/2010/09/22/rails-3-quicktip-autoload-lib-directory-including-all-subdirectories/によって提供された
# application.rb 

# Custom directories with classes and modules you want to be autoloadable. 
# config.autoload_paths += %W(#{config.root}/extras) 
config.autoload_paths += %W(#{config.root}/lib) 
config.autoload_paths += Dir["#{config.root}/lib/**/"] 

libディレクトリの自動ロードを有効にすることなくこの問題を解決する方法を知りたいと考えています。何かご意見は?

関連する問題