2012-03-14 3 views
2

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

def test_case 
    u = User.new 
    u.first_name = "JimBob" 
    u.last_name = "joe" 
    u.email = "[email protected]" 
    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 = "[email protected]" 
    u.password = "sailsJ123" 
    u.password_confirmation = "sailsJ123" 
    u.delay.save 
    end 

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

ТАК Короче говоря:

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

Что такое объект и имя объекта метода DJ? – AMIT

+0

@AMIT это просто аббревиатура от «Задержка задания». – Roshan

ответ

0

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

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

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

self.delay.test_case 

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

Я думаю, что ваш второй звонок «delay на что-то еще» движется в правильном направлении.

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

class ItsAJob 
    def perform 
     u = User.new 
     u.first_name = "JimBob" 
     u.last_name = "joe" 
     u.email = "[email protected]" 
     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 = "[email protected]" 
     u.password = "sailsJ123" 
     u.password_confirmation = "sailsJ123" 
     u.save 
    end 

конец

0

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

+0

Можете ли вы подробно рассказать? – Alex

+0

Когда вы задерживаете метод на объекте ActiveRecord, DJ просто записывает метод, имя класса и идентификатор в очередь. Когда задание выполняется, фактический объект загружается из базы данных по идентификатору. Поскольку он загружен свежим, любое состояние объекта, которое не сохраняется в базе данных, теряется. Отсрочка обновления модели таким образом будет отсутствовать. – betamatt

Смежные вопросы