1

我安装了delayed_job 3.0.2,它适用于对象的方法调用。但是,如果我在一个类上调用一个范围,例如,

Listing.delay.all

然后我得到错误stack level too deep。如果我在我拥有的任何类上调用任何范围,就会发生这种情况。

这是设计错误吗?我stack level too deep在这里出错的原因是什么?

谢谢你。

4

2 回答 2

3

正确使用delayed_job

要间接回答您的问题,您似乎没有正确使用delayed_job。我将解释你的代码做了什么,并建议你可能正在尝试做什么。

Listing.delay.all

下面的方法delay(在本例中为all)将在后台执行。它不会返回列表数组,而是返回一个 Delayed::Backend::ActiveRecord::Job 对象。这不是你的情况发生的事情,但我会谈到这一点。

您背景的任何作业都应该有副作用,因为延迟作业的返回值不会被存储。通常,副作用是将某些内容存储在数据库中、创建文件或其他可以在以后检测和使用的内容。通过查看delayed_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"]

也就是说, theListing.all和所有其他范围方法没有任何副作用;他们只查找范围内的列表并返回它们。使用delayed_job时,一定要只在有副作用的方法上使用,比如更新数据库等。

不幸的是,在不知道您要完成什么的情况下,很难就如何在您的场景中使用delayed_job 给出建议,或者即使它是适合该工作的工具。

您的错误消息 - 堆栈级别太深

首先,我会说出现堆栈级别太深的错误Listing.delay.all是不正常的。我能够User在我的 Rails 3 应用程序中的 ActiveRecord 模型上使用 delay_job 3.0.2,并且效果很好。(它没有做任何有价值的事情,但它返回了一个 Job 而不是抛出你得到的错误。)

> 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"> 

同样,没有更多信息,任何人都无法帮助您找出错误。我建议首先弄清楚delayed_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 回答