Delayed_job не будет запускать пользовательский метод - PullRequest
2 голосов
/ 14 марта 2012

Я пытался заставить DelayedJob запустить некоторые пользовательские методы в фоновом режиме.Для этого тестового примера я определил следующий метод в помощнике:

 def test_case
    u = User.new
     u.first_name = "JimBob"
     u.last_name = "joe"
     u.email = "itworked@eureka.com"
     u.password = "sailsJ123"
     u.password_confirmation = "sailsJ123"
     u.save
  end

Затем в действии контроллера я определяю:

  def action_name
     #whatever it does outside of this
     test_case

  end

Это заставляет test_case создавать нового пользователя, когдадействие здесь запущено.Если я пытаюсь отложить задание, я изменяю его на:

  def action_name
     #whatever it does outside of this
     self.delay.test_case
  end

Это вызывает создание delayed_job, но с определенными признаками того, что я делаю это неправильно: в частности, обработчик в таблице delayed_jobсодержит всю информацию, загруженную в другом месте в action_name (в данном случае это очень большой файл длиной около 50000 символов), а не просто в простой обработчик, указывающий на выполнение test_case или что-то в этом роде.

Если я изменю это для продолжения тестирования, япопытался сделать:

 def action_name
     #whatever it does outside of this
     u = User.new
     u.first_name = "JimBob"
     u.last_name = "joe"
     u.email = "itworked@eureka.com"
     u.password = "sailsJ123"
     u.password_confirmation = "sailsJ123"
     u.delay.save
  end

Это создает DJ успешно и, как и ожидалось, загружает обработчик, указывающий детали (например, u.name => "JimBob" ...).Но когда задание запущено, новый пользователь не создается.Я даже пытался переключить его просто для того, чтобы уничтожить пользователя (хотя, возможно, создать пользователя с DJ может быть сложно, учитывая способ обработки полей пароля), но это не сработало.

ТАКАЯ длинная историяshort:

  1. Как заставить DJ правильно запускать фоновые методы?
  2. Как получается, что в случаях, когда создаются отложенные задания, которые выглядят просто, никаких изменений не вноситсябаза данных?

Ответы [ 2 ]

0 голосов
/ 14 марта 2012

Вы не можете отложить # сохранение на моделях ActiveRecord, так как DJ попытается перезагрузить модель из базы данных перед выполнением вашего действия.Все данные будут потеряны.Вместо этого создайте класс Job с помощью метода #perform, который создает пользователя.

0 голосов
/ 14 марта 2012

Это не означает, что что-то не так:

Таблица delayed_job содержит всю информацию, загруженную в другом месте в action_name

Это можно ожидать в этом случае, потому чтовы говорите так:

self.delay.test_case

и self - это контроллер, который, как оказалось, имеет params и все виды других вещей, которые вам, вероятно, не важны;Ди-джей должен будет сериализовать self, чтобы обеспечить соответствующий контекст для запуска test_case.Возможно, вы где-то сталкиваетесь с ограничением размера, когда этот большой файл застрял в self.

Я думаю, что ваш второй подход "вызов delay на что-то другое" движется в правильном направлении.

Вы можете попробовать запросить класс задания:

class ItsAJob
    def perform
        u = User.new
        u.first_name = "JimBob"
        u.last_name = "joe"
        u.email = "itworked@eureka.com"
        u.password = "sailsJ123"
        u.password_confirmation = "sailsJ123"
        u.save
    end
end

# and elsewhere...
Delayed::Job.enqueue(ItsAJob.new)

Или попытаться сделать свой метод методом класса, чтобы вы могли .delay в классе:

class YourController
    def action_name
        self.class.delay.test_case
    end

    def self.test_case
        u = User.new
        u.first_name = "JimBob"
        u.last_name = "joe"
        u.email = "itworked@eureka.com"
        u.password = "sailsJ123"
        u.password_confirmation = "sailsJ123"
        u.save
    end

end

...