2012-04-23 2 views
1

У меня установлен delayed_job 3.0.2, и он работает с вызовами методов на объектах. Однако, если я называю сферы по классу, например,delayed_job не работает с Rails Область ActiveRecord

Listing.delay.all

тогда я получаю ошибку stack level too deep. Это происходит, если я вызываю любую область действия для любого класса, который у меня есть.

Это ошибка по дизайну? По какой причине я получаю ошибку stack level too deep?

спасибо.

+0

какая версия отложенной работы вы используете? была ошибка в 3.0.0 с задержкой вызова методов класса –

+0

Привет, Я использую delayed_job 3.0.2 – AdamNYC

+1

Почему вы выполняете операцию массового чтения в режиме «отложен»? –

ответ

3

Использование delayed_job правильно

Чтобы ответить на ваш вопрос косвенно, это выглядит, как вы не используете delayed_job права. Я объясню, что делает ваш код, и предлагайте то, что вы, вероятно, пытаетесь сделать.

Listing.delay.all 

Метод следующие delay (в данном случае, all) будут выполнены в фоновом режиме. Вместо возврата массива списков он вернет объект Delayed :: Backend :: ActiveRecord :: Job. Это не то, что происходит в вашем случае, но я доберусь до этого.

Любое задание, которое должно быть у вас на заднем плане, должно быть side effect, так как возвращаемое значение отложенных заданий не сохраняется. Обычно побочным эффектом является хранение чего-то в базе данных, создание файла или что-то еще, что можно обнаружить и использовать позже. Просмотрев таблицу заданий 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"] 

Тем не менее, Listing.all и все другие методы, область применения не имеют каких-либо побочных эффектов; они просматривают только облаченные списки и возвращают их. При использовании delayed_job обязательно используйте его только для методов, которые имеют побочные эффекты, такие как обновление базы данных и т. Д.

К сожалению, не зная, чего вы пытаетесь достичь, трудно дать совет о том, как использовать delayed_job в вашем сценарии или даже если это правильный инструмент для работы.

Ваше сообщение об ошибке - уровень стека слишком глубоко

Во-первых, скажу, что получить уровень стека слишком глубоко ошибки на Listing.delay.all не является нормальным. Я смог использовать его в модели ActiveRecord User в моем приложении Rails 3 с delayed_job 3.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"> 

Опять же, существует не так много каждый может сделать, чтобы помочь вам понять, что ошибка без дополнительной информации. Я рекомендую начать с выяснения, является ли delayed_job действительно подходящим инструментом для того, что вы делаете (это не если вы используете его для передачи данных в представление), используйте его правильно, а затем посмотрите, все ли вы проблема.

+0

Спасибо за потрясающий ответ! Я получил рассказ о побочных эффектах. Невозможно обернуть голову тем, что уровень стека слишком глубокий. Я протестировал 'User.delay.all' на моей консоли и получил следующую ошибку:' 1.9.2-p290: 001> User.delay.all SystemStackError: уровень стека слишком глубокий \t от /Users/myname/.rvm/ rubies/ruby-1.9.2-p290/lib/ruby ​​/ 1.9.1/irb/workspace.rb: 80 Возможно, ошибка IRB !! 1.9.2-p290: 002> ' – AdamNYC

+1

Не очень вероятно проблема irb. Скорее, некоторое взаимодействие с драгоценным камнем, который вы используете. Не стоит вникать, хотя, если использовать задержку, которая не делает ничего полезного. –

+0

@AdamNYC Вы когда-нибудь находили причину своей ошибки? У меня такая же проблема с workspace.rb: 80 –

1

Необходимо создать собственное задание, а затем установить его в очередь.

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

Delayed::Job.enqueue UserJob.new() 
Смежные вопросы