1

delay_job 3.0.2をインストールしましたが、オブジェクトのメソッド呼び出しで機能します。ただし、たとえば、クラスでスコープを呼び出すと、

Listing.delay.all

その後、エラーが発生しますstack level too deep。これは、自分が持っているクラスのスコープを呼び出すと発生します。

このエラーは仕様によるものですか?stack level too deepここでエラーが発生する理由は何ですか?

ありがとうございました。

4

2 に答える 2

3

delayd_jobを適切に使用する

間接的に質問に答えるには、delayed_jobを正しく使用していないようです。私はあなたのコードが何をするのかを説明し、あなたがおそらく何をしようとしているのかを提案します。

Listing.delay.all

次のメソッドdelay(この場合all)はバックグラウンドで実行されます。リストの配列を返す代わりに、Delayed :: Backend :: ActiveRecord::Jobオブジェクトを返します。これはあなたの場合に起こっていることではありませんが、私はそれに行きます。

遅延したジョブの戻り値は保存されないため、バックグラウンドで実行するジョブには副作用があります。通常、副作用は、データベースに何かを保存したり、ファイルを作成したり、後で検出して使用できる何かを作成したりすることです。delayd_jobジョブテーブルを見ると、戻り値が格納されていないことがわかります。

> Delayed::Backend::ActiveRecord::Job.column_names
 => ["id", "priority", "attempts", "handler", "last_error", "run_at", "locked_at", "failed_at", "locked_by", "queue", "created_at", "updated_at"]

とはいえ、Listing.allおよび他のすべてのスコープメソッドには副作用はありません。スコープリストを検索して返すだけです。delay_jobを使用する場合は、データベースの更新など、副作用のあるメソッドでのみ使用してください。

残念ながら、何を達成しようとしているのかがわからないと、シナリオでdelayed_jobを使用する方法について、またはそれがジョブに適したツールである場合でも、アドバイスを提供することは困難です。

エラーメッセージ-スタックレベルが深すぎます

Listing.delay.allまず、スタックレベルのエラーが深すぎるのは正常ではないと言います。Rails3アプリのActiveRecordモデルUserでdelayed_job3.0.2を使用して使用できましたが、正常に機能しました。(それは価値のあることは何もしませんでしたが、あなたが得たエラーをスローする代わりにジョブを返しました。)

> User.delay.all
 => #<Delayed::Backend::ActiveRecord::Job id: 1, priority: 0, attempts: 0, handler: "--- !ruby/object:Delayed::PerformableMethod\nobject:...", last_error: nil, run_at: "2012-05-02 02:10:39", locked_at: nil, failed_at: nil, locked_by: nil, queue: nil, created_at: "2012-05-02 02:10:39", updated_at: "2012-05-02 02:10:39"> 

繰り返しになりますが、詳細情報なしでそのエラーを理解するためにできることはほとんどありません。delay_jobが実際に実行しているツールに適しているかどうかを判断することから始めて(データをビューに渡すために使用している場合ではありません)、適切に使用してから、まだ実行しているかどうかを確認することをお勧めします。問題があります。

于 2012-05-02T02:27:15.200 に答える
1

カスタムジョブを作成してから、それをキューに入れる必要があります。

class UserJob < Struct.new
  def perform
    User.all
  end
end

Delayed::Job.enqueue UserJob.new()
于 2012-06-19T09:51:28.343 に答える